springcloud集成nacos作为配置中心和注册中心

nacos 作为配置中心

 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
version: '3'
services:
  nacos:
    restart: always
    image: nacos/nacos-server:v2.2.1
    # 容器名称
    container_name: nacos
    # 端口映射
    ports:
      - 8848:8848
      - 9848:9848
      - 9849:9849
    # 容器权限
    privileged: true
    # 参数设置
    environment:
      JVM_XMS: 128m
      JVM_XMX: 128m
      JVM_MS: 64m
      JVM_MMS: 64m
      MODE: standalone
      NACOS_REPLICAS: 1
      PREFER_HOST_MODE: ip
    volumes:
      - ./nacos/logs:/home/nacos/logs
      - ./nacos/plugins:/home/nacos/plugins
      - ./nacos/data:/home/nacos/data
      - ./nacos/config/application.properties:/home/nacos/conf/application.properties
    networks:
      - dev
  cache:
    image: redis:6.2-alpine
    restart: always
    ports:
      - '6379:6379'
    command: redis-server --save 20 1 --loglevel warning
    volumes:
      - cache:/data
networks:
  dev:
    external: true
volumes:
  cache:
    driver: local

基于服务提供者 account-svc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>
	</dependencies>

yaml 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
spring:
  application:
    name: account-svc
  profiles:
    active: dev
  cloud:
    nacos:
      username: "nacos"
      password: "nacos"
      config:
        server-addr: 127.0.0.1:8848
        # namespace id
        namespace: 3ef5e608-6ee8-4881-8e50-ed47a5a04af2
        # 阿里云平台ak,sk
        # access-key:
        # secret-key:
        # 配置文件格式
        file-extension: yml
        group: DEFAULT_GROUP
        shared-configs:
          - ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

开启主动类注解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18

@SpringBootApplication
@EnableDiscoveryClient
public class AccountApplication {

	@Value("${server.port}")
	private String port;

	@PostConstruct
	public void init() {
		System.out.println("port: " + port);
	}

	public static void main( String[] args ) {
		SpringApplication.run(AccountApplication.class, args);
	}

}

在 nacos 上配置 account-svc-dev.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
 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
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
server:
  port: 8088
spring:
  application:
    name: account-svc
  profiles:
    active: dev
  datasource:
    dynamic:
      #设置默认的数据源或者数据源组,默认值即为master
      primary: master
      #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      strict: false
      #开启读写分离
      rw: true
      #开启分页
      page: true
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3316/ruuby-stock?useUnicode=true&characterEncoding=UTF8&statementInterceptors=com.redick.support.mysql.Mysql5StatementInterceptor
          username: root
          password: admin123
          driver-class-name: com.mysql.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
          initialSize: 5
          minIdle: 5
          maxActive: 20
        slave:
          url: jdbc:mysql://127.0.0.1:3326/ruuby-stock?useUnicode=true&characterEncoding=UTF8&statementInterceptors=com.redick.support.mysql.Mysql5StatementInterceptor
          username: root
          password: admin123
          driver-class-name: com.mysql.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
          initialSize: 5
          minIdle: 5
          maxActive: 20
  # 解决springboot 2.6以上集成swagger3报错问题
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  cloud:
    nacos:
      username: "nacos"
      password: "nacos"
      discovery:
        # 服务注册中心地址
        server-addr: 127.0.0.1:8848
        # 阿里云平台aksk
        # access-key:
        # secret-key:
        namespace: 3ef5e608-6ee8-4881-8e50-ed47a5a04af2
      config:
        server-addr: 127.0.0.1:8848
        # 阿里云平台aksk
        # access-key:
        # secret-key:
        # 配置文件格式
        file-extension: yml
        shared-configs:
          - ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
        namespace: 3ef5e608-6ee8-4881-8e50-ed47a5a04af2
        group: DEFAULT-GROUP
    stream:
      function:
        # consumer bean,多个的话用";"分隔
        definition: consumer
      # Spring Cloud Stream RocketMQ配置项
      rocketmq:
        binder:
          # name server
          name-server: 172.17.10.179:9876
          # 阿里云ak sk配置
          # accessKey:
          # secretKey:
          # 是否为ProducerConsumer开启消息轨迹功能 默认 true
          # enableMsgTrace: false
          # 消息轨迹开启后存储的 topic 名称 默认 RMQ_SYS_TRACE_TOPIC
          # customizedTraceTopic: RMQ_SYS_TRACE_TOPIC
        bindings:
          # 生成规则 function.definition - in - index(坑)
          consumer-in-0:
            # RocketMQ Consumer配置项
            consumer:
              # 是否开启消费,默认为 true
              enabled: true
              # 是否使用广播消费,默认为 false 使用集群消费,如果要使用广播消费值设成true
              broadcasting: false
      # Binding配置项
      bindings:
        consumer-in-0:
          # RocketMQ Topic
          destination: TPC_Test_dev
          content-type: application/json
          # 消费者组,RocketMQGroup
          group: GID_Test_dev

management:
  endpoints:
    web:
      exposure:
        include: "*"
# swagger配置
swagger:
  enabled: true
  basePackage: io.redick.cloud.account
  title: Account模块接口文档
  description: Account模块接口文档
  version: 0.0.1
  terms-of-service-ur: io.redick.cloud.account
springfox:
  documentation:
    swagger:
      v2:
        path: /account/v2/api-docs

基于 nacos 的消费者

 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
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.18</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

yaml 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
server:
  port: 8089
spring:
  application:
    name: order-svc
  cloud:
    nacos:
      username: "nacos"
      password: "nacos"
      discovery:
        # ????????
        server-addr: 127.0.0.1:8848
        # ?????ak?sk
        # access-key:
        # secret-key:
management:
  endpoints:
    web:
      exposure:
        include: "*"

启动类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }





}

loadbance 相关类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

public class MyLoadBalancerConfig {
    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
        LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        // 随机轮询
        return new RandomLoadBalancer(loadBalancerClientFactory
            .getLazyProvider(name, ServiceInstanceListSupplier.class),
            name);
//                return new NacosLoadBalancer(loadBalancerClientFactory
//                        .getLazyProvider(name, ServiceInstanceListSupplier.class), name, nacosDiscoveryProperties);
    }

}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10

@Configuration
@LoadBalancerClient(name = "account-svc", configuration = MyLoadBalancerConfig.class)
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

controller 写法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Resource
    private RestTemplate restTemplate;
    @GetMapping("/echo")
    public String echo(){
        ServiceInstance serviceInstance = loadBalancerClient.choose("account-svc");
        String url = String.format("http://%s:%s/echo/%s", serviceInstance.getHost(), serviceInstance.getPort(), "order-svc");
        System.out.println("request url:" + url);
        return restTemplate.getForObject(url, String.class);
    }
    private static final String SERVICE_URL = "http://account-svc";



    @GetMapping("/test")
    public String consumerTest() {
        return restTemplate.getForObject(SERVICE_URL + "/echo/test", String.class);
    }
}

注意今天遇到问题:

1
no instance for servie 说是服务的提供者在obect上,但是后面多次修改后,没有这个问题。

报错

解决 No spring.config.import property has been defined 问题

1
但是在SpringCloud 2020.* 版本把bootstrap禁用了,导致在读取文件的时候读取不到而报错,所以我们只要把bootstrap从新导入进来就会生效了。

集成 log4j2

 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
  <!-- 修复log4j2漏洞 -->
            <log4j2.version>2.17.1</log4j2.version>
            <!-- log4j2支持异步日志,导入disruptor依赖,不需要支持异步日志,也可以去掉该依赖包 -->
             <log4j2.disruptor.version>3.4.4</log4j2.disruptor.version>

            <!-- 修复log4j2漏洞 -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>${log4j2.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>${log4j2.version}</version>
            </dependency>
            <!-- log4j2读取spring配置的依赖库 -->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-spring-boot</artifactId>
                <version>${log4j2.version}</version>
            </dependency>
            <!-- log4j2支持异步日志,导入disruptor依赖,不需要支持异步日志,也可以去掉该依赖包 -->
            <dependency>
                <groupId>com.lmax</groupId>
                <artifactId>disruptor</artifactId>
                <version>${log4j2.disruptor.version}</version>
            </dependency>

移除依赖中的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

另外如果要 bootstrap 需要引入 springcloud 的 bootstrap 依赖。

学习一下这个:

因为在 SpringBoot 中存在很多子依赖,以及在 jar 包中存在其他依赖 logback 的 jar 包,这里需要使用 Maven 工具来定位查找这些依赖 Logback 的 jar 包,逐一排除掉。在工程文件夹下执行 Maven 命令:

1
mvn dependency:tree -Dverbose -Dincludes="ch.qos.logback:logback-classic"

输出如下:

 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
👉👉👉➡️ ➡️ ➡mvnmvn dependency:tree -Dverbose -Dinclud"ch.qos.logback:logback-classic"ic"

[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for io.redick.cloud:ruuby-account-svc:jar:0.0.1-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.springframework.boot:spring-boot-maven-plugin is missing. @ io.redick.cloud:ruuby-account:0.0.1-SNAPSHOT, /home/xfhuang/workspace/java/ruuby-account/pom.xml, line 66, column 21
[WARNING]
[WARNING] Some problems were encountered while building the effective model for io.redick.cloud:ruuby-order-svc:jar:0.0.1-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.springframework.boot:spring-boot-maven-plugin is missing. @ io.redick.cloud:ruuby-account:0.0.1-SNAPSHOT, /home/xfhuang/workspace/java/ruuby-account/pom.xml, line 66, column 21
[WARNING]
[WARNING] Some problems were encountered while building the effective model for io.redick.cloud:ruuby-account:pom:0.0.1-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.springframework.boot:spring-boot-maven-plugin is missing. @ line 66, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] ruuby-account                                                      [pom]
[INFO] ruuby-account-svc                                                  [jar]
[INFO] ruuby-order-svc                                                    [jar]
Downloading from maven-public: http://10.7.20.39:8081/repository/maven-public/org/springframework/boot/spring-boot-maven-plugin/maven-metadata.xml
Downloaded from maven-public: http://10.7.20.39:8081/repository/maven-public/org/springframework/boot/spring-boot-maven-plugin/maven-metadata.xml (7.8 kB at 294 B/s)
[INFO]
[INFO] -------------------< io.redick.cloud:ruuby-account >--------------------
[INFO] Building ruuby-account 0.0.1-SNAPSHOT                              [1/3]
[INFO]   from pom.xml
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ ruuby-account ---
[INFO]
[INFO] -----------------< io.redick.cloud:ruuby-account-svc >------------------
[INFO] Building ruuby-account-svc 0.0.1-SNAPSHOT                          [2/3]
[INFO]   from ruuby-account-svc/pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ ruuby-account-svc ---
[INFO]
[INFO] ------------------< io.redick.cloud:ruuby-order-svc >-------------------
[INFO] Building ruuby-order-svc 0.0.1-SNAPSHOT                            [3/3]
[INFO]   from ruuby-order-svc/pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ ruuby-order-svc ---
[INFO] io.redick.cloud:ruuby-order-svc:jar:0.0.1-SNAPSHOT
[INFO] \- org.springframework.boot:spring-boot-starter-web:jar:3.0.5:compile
[INFO]    \- org.springframework.boot:spring-boot-starter:jar:3.0.5:compile
[INFO]       \- org.springframework.boot:spring-boot-starter-logging:jar:3.0.5:compile
[INFO]          \- ch.qos.logback:logback-classic:jar:1.4.6:compile
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for ruuby-account 0.0.1-SNAPSHOT:
[INFO]
[INFO] ruuby-account ...................................... SUCCESS [  1.576 s]
[INFO] ruuby-account-svc .................................. SUCCESS [  0.764 s]
[INFO] ruuby-order-svc .................................... SUCCESS [  0.187 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  30.044 s
[INFO] Finished at: 2023-11-29T16:25:53+08:00
[INFO] ------------------------------------------------------------------------

由于最近爆发的 log4j2 和 logback 的漏洞问题,请选择最新修复漏洞的版本。根据网上很多性能的对比,log4j2 显著优于 logback,所以我们将 SpringBoot 默认的日志 Logback 修改为 Log4j2。    在框架设计时,我们尽可能的考虑到日志系统的使用场景,将日志系统实现方式设计为可动态配置的,然后具体根据业务需求,选择使用合适的日志系统,根据常用业务需求,我们暂将微服务日志系统以如下方式实现:

参考文档:

http://www.pymjl.com/#/blog/cloud-learn-loadbalacer

日志打印注意

 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
以控制台输出为例来进行测试,在上面“CONSOLE”的<Filters>节点定义不同的ThresholdFilter来测试输出。


<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
2018-12-28 16:07:44,477 INFO [main] (MyLogTest.java:11) - info level
2018-12-28 16:07:44,479 WARN [main] (MyLogTest.java:12) - warn level


<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
2018-12-28 16:09:43,849 INFO [main] (MyLogTest.java:11) - info level

<ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
高于INFO的都不打印,因为root日志级别是info,所以就不会打印任何日志了。


<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
只打印INFO和ERROR


<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
只打印ERROR及以上(即ERROR和FATAL)(error.log文件的标配)


<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="ACCEPT"/>
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>(Filters节点里只有这一个Filter时)
打印INFO、WARN、ERROR(常见的info.log文件的标配)



总结
a)ThresholdFilter属性:onMatch表示匹配设定的日志级别后是DENY还是ACCEPT,onMismatch表示不匹配设定的日志级别是DENY还是ACCEPT还是NEUTRAL
b)上面说的match/misMatch指的是高于或等于设定的日志级别。所以,要先定义日志级别高的Filter。

onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL

介绍一下这两个配置项的三个属性值:

onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的
Licensed under CC BY-NC-SA 4.0
最后更新于 Sep 10, 2025 02:16 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up