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
# 阿里云平台ak,sk
# access-key:
# secret-key:
namespace: 3ef5e608-6ee8-4881-8e50-ed47a5a04af2
config:
server-addr: 127.0.0.1:8848
# 阿里云平台ak,sk
# 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:
# 是否为Producer和Consumer开启消息轨迹功能 默认 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
# 消费者组,RocketMQ的Group
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" 表示不匹配该级别以下的
|