Nacos使用教程
Nacos (Dynamic Naming and Configuration Service) 是一个开源的、易于使用的动态服务发现、配置管理和服务管理平台。 它帮助开发团队实现微服务架构中的服务发现、服务注册、配置管理和流量管理等功能。
- 第一节介绍了nacos的部署,需要留意下控制台的登录配置;
- 第二节介绍依赖的版本要求,需要springcloud对应springboot的版本要求;
- 第三节介绍了使用nacos作为配置中心,动态修改项目配置值,注意默认会把
spring.application.name
作为配置id; - 第四节介绍了nacos的服务注册功能,也就是配置服务
provider
对外暴露接口,默认也是把应用名进行服务注册; - 第五节内容就比较复杂点,使用nacos的服务发现功能,在
consummer
端需要用loadbalancer
负载均衡组件拉取的所有服务,再选出一个服务进行http请求,当然这些都是openfeign
封装好的功能,就使用方面来说是很简单的;
一、nacos部署🐟
-
1.拉取官方配置
git clone https://github.com/nacos-group/nacos-docker.git
-
2.单机模式mysql8启动
docker-compose -f example/standalone-mysql-8.yaml up
-
2.集群模式
docker-compose -f example/cluster-hostname.yaml up -d
-
3.访问控制台
http://127.0.0.1:8848/nacos/
问题
-
配置访问账号-坑
https://nacos.io/zh-cn/docs/auth.html
- 使用
https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
脚本,dockerfile中访问的在线文件rawxxx
是不带用户配置的!
- 使用
-
mysql健康检测提示root连接失败
- 创建ping命令脚本
- 添加执行权限:
chmod +x mysql_ping.sh
- 修改dockerfile
example/cluster-hostname.yaml
mysql: container_name: mysql build: context: . dockerfile: ./image/mysql/5.7/Dockerfile image: example/mysql:5.7 env_file: - ../env/mysql.env volumes: - ./mysql:/var/lib/mysql - ./mysql_ping.sh:/mysql_ping.sh ports: - "3306:3306" healthcheck: # test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ] test: ["CMD", "/bin/sh", "/mysql_ping.sh"] interval: 5s timeout: 10s retries: 10
-
使用外部mysql(每次启动集群时 mysql 服务启动都很慢,这里直接使用外部 mysql )
- 部署外部mysql:地址为192.168.0.109:3306
- 创建化数据库:nacos_devtest
- 执行初始化脚本:https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
- 创建访问用户并授权操作
nacos_devtest
库:nacos/nacos # 具体操作可参考 mysql记录 - 修改nacos配置(nacos服务连接数据库用的地址、端口、数据库名、账号、密码等都可以在该文件中指定)
- 启动集群即可:
docker-compose -f example/cluster-hostname.yaml up -d
二、依赖导入🐟
- 对应springcloud版本
springboot版本 | springcloud版本 |
---|---|
3.2.4 | 2023.0.1 (aka Leyton) |
- maven依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>4.1.2</version>
</dependency>
<!-- 动态配置依赖 -->
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2023.0.1.0</version>
</dependency>
<!-- 服务注册与发现依赖 -->
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2023.0.1.0</version>
</dependency>
<!-- 服务请求依赖 -->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>4.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-okhttp -->
<!-- openfeign的http请求库 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>13.2.1</version>
</dependency>
<!-- 服务请求负载均衡依赖 -->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>4.1.2</version>
</dependency>
注意⚠️:负载均衡组件
ribbon
和 服务熔断组件hystrix
已经不维护了,这里用loadbalancer
和sentinel
代替。(当然目前feign-hystrix
还是被海量使用der)
三、项目接入配置中心🐟
1.修改配置文件🐟
spring:
application:
name: config
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
- 启用
bootstrap
配置: 2021.0.5 版本起,Spring Cloud 不再默认启用 bootstrap 包,添加上依赖即可。
2.创建nacos配置🐟
- 进入
nacos
控制台->配置管理->配置列表->创建配置- Data ID: 使用
bootstrap.yml
文件中配置的spring.application.name
值,也就是config
- 配置格式:
yaml
- 配置内容:
shafish.io.config.name: "shafishshasha"
- 发布
- Data ID: 使用
3.使用配置类🐟
- 创建配置类并注入spring中
@Component
@ConfigurationProperties(prefix = "shafish.io.config")
public class IoConfig {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 使用配置类
@RestController
@RequestMapping("/config")
public class ConfigController {
@Autowired
private IoConfig ioConfig;
@GetMapping("/get")
public Object get() {
return ioConfig.getName();
}
}
- 修改
nacos
配置值,再重新访问接口看看内容是否变化。
四、服务注册🐟
1.修改配置文件🐟
spring:
application:
name: config
cloud:
nacos:
discovery: # (1)
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
- 如果注册中心和配置中心用的是同一个nacos, 可以把本级去掉
2.暴露服务接口🐟
@RestController
@RequestMapping("/config")
public class ConfigController {
// @Autowired
// private IoConfig ioConfig;
@GetMapping("/get")
public RestResult<Object> get() {
// throw new RuntimeException();
// return new RestResult<>(true, "success", ioConfig.getName());
return new RestResult<>(true, "msg:success", "data:hello,shafish");
}
}
3.效果🐟
加完依赖,改好配置,直接启动项目就行,可以忽略引入 @EnableDiscoveryClient
注解。打开nacos管理后台->服务管理->服务列表,就能看到注册到 nacos
中的应用了。
五、服务发现🐟
这里使用
openfeign
的方式请求服务。需要引入spring-cloud-starter-openfeign
和spring-cloud-starter-loadbalancer
组件,openfeign
进行声明式请求,loadbalancer
对provider服务进行负载均衡访问。
1.修改配置文件🐟
spring:
application:
name: config-consummer
cloud:
nacos:
discovery: # (1)
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
openfeign:
okhttp: # (2)
enabled: true
compression: # (3)
request:
enabled: true
mime-types: application/xml,text/xml,application/json,text/html,text/plain # (4)
min-request-size: 512 # (5)
response:
enabled: true
- 如果注册中心和配置中心用的是同一个nacos, 可以把本级去掉
- 启用okhttp
- 开启请求数据的压缩功能
- 压缩支持的MIME类型
- 数据压缩下限 512 表示传输数据大于512,才会进行数据压缩(最小压缩值标准)
2.引入组件🐟
引入
@EnableFeignClients
注解会自动扫描用户定义的feignClient
,以生成对应的代理类进行 http 接口请求
在启动类中引入 openfeign
组件注解:@EnableFeignClients
3.feignClient 定义🐟
@FeignClient(value = "config", contextId = "ConfigService") // , fallbackFactory = ConfigClientFallback.class
public interface ConfigFeignClient {
@GetMapping("/config/get")
RestResult<Object> getConfig();
}
- value值指定被调用的服务名,也就是
nacos
注册中的服务名spring.applicationi.name: config
; - contextId值用当前类名即可,动态代理时指定 代理类bean的name;
FeignClient
注解还有其他属性,比如:http请求配置(请求超时、请求参数对象序列化)、负载均衡处理(需引入loadbalancer
/ribbon
组件)、服务降级处理(需引入hystrix
/sentienl
/resilience4J
组件)、请求拦截处理等等,详细在 OpenFeign使用教程 这篇文章中介绍。这里知道简单使用就行;- 当然如果直接用
url
参数指定服务所在的ip:端口,则不需引入上面第二节中的负载均衡组件spring-cloud-starter-loadbalancer
;
4.服务调用🐟
@RestController
public class ConfigConsummerController {
@Autowired
private ConfigFeignClient configFeignClient;
@GetMapping("/get")
public RestResult<Object> get() {
return configFeignClient.getConfig();
}
}
Tip
一般来说用 nacos
可以一步到位地管理应用配置和服务,也提供高可用部署。方便👍
ref:
最后更新: 2024年6月21日 22:29:28