这是我学习《微服务从小白到专家》的学习笔记。官方代码地址:https://github.com/banxian-yao/broadview-coupon-center

第三章

第三章直接使用官方代码,所有的依赖服务:mysql, redis, kafka, rabbitmq,自己都使用Docker进行安装,使用docker-compose进行管理,docker-compose.yml内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
version: "3.9"

services:
  mysql80:
    container_name: mysql80
    image: mysql
    ports:
      - "3306:3306"
    volumes:
      - "./data/mysql:/var/lib/mysql"
    environment:
      - MYSQL_ROOT_PASSWORD=password

  zookeeper:
    container_name: zookeeper
    image: zookeeper
    ports:
      - "2181:2181"

  kafka:
    container_name: kafka
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      - KAFKA_ADVERTISED_HOST_NAME=192.168.0.106
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181

  rabbitmq:
    container_name: rabbitmq
    image: rabbitmq:management
    ports:
      - "5672:5672"
      - "15672:15672"
    environment:
      - RABBITMQ_DEFAULT_USER=guest
      - RABBITMQ_DEFAULT_PASS=guest

  redis:
    container_name: redis
    image: redis
    ports:
      - "6379:6379"

docker-compose.yml配置的时候需要注意的几点:

  1. 升级spring boot到2.5.6版本
  2. 里面有commons-collections4commons-lang3依赖的地方的版本特别注意,在最顶层的pom.xml里面重复写了两个,需要删掉一个。每个module下面也写了版本号,需要把版本号去掉
  3. KAFKA_ADVERTISED_HOST_NAME 改成自己物理机的IP地址
  4. RABBITMQ_DEFAULT_USER 和 RABBITMQ_DEFAULT_PASS 都是guest,而且rabbitmq启动之后必须在admin ui里面手动创建broadview.queue这个queue

第五章 Eureka

spring-cloud-dependencies的依赖升级到2020.0.4

1
<spring.cloud-version>2020.0.4</spring.cloud-version>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

需要额外引用gson的依赖

1
2
3
4
5
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.8</version>
</dependency>

EurekaApplication上面的注解是EnableEurekaServer,书中写的是EnableDiscoveryClient是错误的。

浏览器访问的时候是不需要/eureka这个endpoint。

第六章 Nacos

各依赖版本分别如下:

Spring Boot: 2.5.6 Spring Cloud: 2020.0.4 Nacos Config: 2021.1

特别注意的一点是需要添加如下的依赖:

1
2
3
4
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

配置管理

需要先启动nacos server,可以使用docker的方式快速启动一个standalone的容器。git clone https://github.com/nacos-group/nacos-docker之后进行nacos-docker目录,使用docker-compose -f example/standalone-derby.yaml up -d启动nacos server。

启动之后访问http://localhost:8848/nacos使用用户密码均为nacos的账号进行登录,创建一个spring.application.name的dataID,特别需要注意的是要把后缀名给加上,比如nacos-demo.properties

完整的pom.xml如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
    </parent>

    <groupId>org.example</groupId>
    <artifactId>NacosDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <spring-cloud.version>2020.0.4</spring-cloud.version>
        <nacos.version>2021.1</nacos.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${nacos.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

服务注册与服务发现

2021.1版本的alibaba nacos已经不包含Ribbon负载均衡了,可以使用spring cloud loadbalancer,包含如下的依赖到consumer的pom.xml即可:

1
2
3
4
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>