nacos
阿里巴巴的技术推出的产品。
现在是springCloud中的组件,功能更加丰富。
可自行搜索下载。
- 启动命令:
startup.cmd -m standalone
打开启动提供的地址,即可看到nacos页面。
搭建
父工程引入管理依赖
<!--nacos管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
在user-service和order-service中的pom文件中引入nacos-discovery依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
启动服务,打开nacos,即可看到服务已经注册上去了。
测试,正常使用
集群
一个服务可以有多个实例部署到不同的地方,同一地方的服务既可以称为一个集群。
微服务访问优先访问同一集群中的服务。(默认依然是轮询,需要配置负载均衡)
分级:
- 一级是服务
- 二级是集群
- 三级就是实例
配置集群,user-service,yaml中添加cluster-name即可。
spring:
application:
name: userservice # 服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nocos服务地址
cluster-name: BJ # 北京
多个user-service一个配置SH,一个配置BJ。
重启服务,nacos点进详请即可看到配置成功。
负载均衡
集群优先
优先选择本地集群服务,集群内随机。
yaml中配置即可
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
若集群内没有对应服务,则会跨集群访问,并报出警告(提示本地集群中的服务挂掉了)。
比如,现在一个order服务在BJ,两个user服务在BJ,一个user服务在SH,现在停掉BJ的两个user服务,然后调用order服务。
可以发现任可继续调用,不过是跨集群调用了(BJ的调用的SH的)。
权重优先
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
很简单啊,nacos中配置一下即可。
权重0 ~ 1; 为 0 永远不访问。
环境隔离
默认public
order 和 user 都在public下。
创建命名空间
配置
spring:
application:
name: orderservice
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: BJ
namespace: 8c72b03a-e379-4290-b0c2-59a236922e25
此时order和User相互隔离,order无法调用user服务。
注册中心原理
配置管理
配置更改热更新
简单理解,就是进行统一的配置管理,方便且不用重启服务。
只把热更新需求的进行配置,其余不变的配置最好还是放在本地。
添加一个配置
发布:
配置拉取
- userservice中引入依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 添加bootstrap.yaml文件
application.yaml中重复的配置可以注释掉。
验证是否配置成功
@Value("${pattern.dateformat}")
private String dateformat;
/**
* 读取nacos中配置,按格式返回当前时机
* @return
*/
@GetMapping("now")
public String now() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
成功以我们配置的形式输出,说明nacos配置成功:
配置热更新
微服务无需重启就可以让nacos中的配置生效
两种方法
- @RefreshScope + @Value所在的类
@Slf4j
@RestController
@RefreshScope // 这个
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Value("${Pattern.dateformat}")
private String dateformat;
/**
* 读取nacos中配置,按格式返回当前时机
* @return
*/
@GetMapping("now")
public String now() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
- @ConfigurationProperties 注入到对象中使用
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
多环境配置共享
配置一个userservice.yaml不加环境,就属于共享配置,dev和test都可以加载到。
验证:
@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat; // dev环境中配置
private String envSharedValue; // 共享环境中的配置
}
@GetMapping("/prop")
public PatternProperties properties() {
return patternProperties;
}
可以发现都可以读取到,说明共享环境生效
如果dev或test或共享或本地 环境中有相同的配置,那么优先级为:
dev/test > 共享 > 本地