Nacos实现服务注册中心和服务配置
服务注册中心
启动nacos,8848端口
添加子模块到nacos-server
pom.xml
<!--引入nacos场景驱动器--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId> </dependency>
application.yml
#配置nacos spring: cloud: nacos: discovery: server-addr: localhost:8848 #配置nacos-server的地址
启动类加@EnableDiscoveryClient
服务名就是spring: application: name:下的名称
可以配置消费者consumer和生产provider,消费者可加ribbon+restemplate
consumer子模块请求nacos的provider子模块集群(member-service-nacos-provider),默认根据轮询来选择调用哪个provider子模块和对应的controller
controller
@RestController
public class MemberNacosConsumerController {
//member-service-nacos-provider就是服务名
public static final String MEMBER_SERVICE_PROVIDER_URL =
"http://member-service-nacos-provider";
@Resource
private RestTemplate restTemplate;
@Resource
private DiscoveryClient discoveryClient;
//添加member数据到数据库
@PostMapping("/member/nacos/consumer/save")
public Result<Member> save(Member member){
//member :发送到对应url的数据
//Result.class :返回数据类型
return restTemplate.postForObject(MEMBER_SERVICE_PROVIDER_URL
+"/member/save",member,Result.class);
}
Nacos与eureka服务注册中心的区别
前者支持ap和cp,后者只支持ap(无心跳服务不会立即销毁)
cp和ap切换
Nacos 集群默认支持的是CAP原则中的AP原则,但是也可切换为CP原则(一般不切
换)
CURL切换命令: curl -X PUT
'$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
URL指令:
$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
服务配置
pom.xml
<!--nacos-config配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-config</artifactId> </dependency>
application.yml
spring: profiles: active: dev #指定环境是 dev/test/prod...开发环境(dev)、测试环境(test)和生产环境(prod)
bootstrap.yml
server:
port: 5000
spring:
application:
#这里的 name 需要参考 nacos 配置中心的 Data Id
# zyz-nacos-config-client-dev.yaml
name: zyz-nacos-config-client
cloud:
nacos:
# 配置中心
config:
server-addr: localhost:8848
file-extension: yaml #指定 yaml 格式的配置
# 服务注册中心
discovery:
server-addr: localhost:8848
添加配置
获取config的配置信息
@RestController @Slf4j @RefreshScope//实现配置数据的自动刷新 public class ConfigNacosController { @Value("${config.ip}") private String configIp; @Value("${config.name}") private String configName; @GetMapping("/config/nacos/ip") public String getConfigIp() { return configIp; } @GetMapping("/config/nacos/name") public String getConfigName() { return configName; } }
注意细节
@Value("${config.ip}"), 是 import org.springframework.beans.factory.annotation.Value;
而不是 lombok 包下的.
配置文件 application.yml 和 bootstrap.yml 结合会得到配置文件/资源的地址
file-extension: yaml而不是yml
springboot 中配置文件的加载是存在优先级顺序的,bootstrap.yml 优先级高于application.yml
@RefreshScope 是 springcloud 原生注解,实现配置信息自动刷新, 如果在 Nacos Server 修改了配置数据,Client 端就会得到最新配置