我在这篇文章中已经写好了服务消费者和服务提供者
给服务提供者和服务消费添加依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<version>2.2.5.RELEASEversion>
dependency>
在application.yml配置文件中添加nacos服务端地址
spring:
cloud:
nacos:
#nacos服务端地址
server-addr: localhost:8848
注意一定要先启动nacos再启动springboot项目
然后启动服务提供者和服务消费者项目
测试
配置集群
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
#配置集群名称(自定义)
cluster-name: HZ
我这启动了四个项目于其中8083设置的是BJ集群剩下三个都是HZ集群
将负载均衡设置为NacosRule表示会优先寻找与自己同集群的服务
userservice:
ribbon:
#负载均衡规则
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
权重负载均衡(权重越低分配到的请求越少,权重为0时不会分配到请求)
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
修改8080服务的命名空间
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
#填命名空间ID
namespace: 15a1ca9f-6f14-4da8-a1c5-7c2fdcf268f9
重启服务
再次访问查询order信息
报错原因:namespace不同导致orderservice找不到userservice实例
04-02 21:40:30:229 ERROR 30908 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] :
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed;
nested exception is java.lang.IllegalStateException: No instances available for userservice] with root cause
spring:
cloud:
nacos:
server-addr: localhost:8848,localhost:8847
discovery:
#设置是否为临时实例
ephemeral: false
一、新建配置信息
Data ID命名推荐使用[服务名]-[运行环境].yaml,后缀推荐使用yaml(不建议使用yml)
二、引入Nacos的配置管理客户端依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
<version>2.2.5.RELEASEversion>
dependency>
三、在resources目录下新建bootstrap.yml文件。这个文件是引导文件,优先级高于application.yml。在程序启动时会根据这个配置文件中的nacos地址、服务名称、当前环境和文件后缀名读取nacos中的配置文件
spring:
application:
#服务名称
name: userservice
profiles:
#开发环境
active: dev
cloud:
nacos:
#Nacos地址
server-addr: localhost:8848
config:
#文件后缀名
file-extension: yaml
Nacos中的配置文件变更后,微服务无需重启就可以感知
第一种方式:添加@RefreshScope注解
@Controller
@RequestMapping("/user")
@RefreshScope
public class UserController {
//...
}
第二种方式:使用配置类
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
注入配置类
@Autowired
private PatternProperties properties;
微服务启动时会从nacos读取多个配置文件:
无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
多种配置的优先级:[服务名]-[环境].yaml>[服务名].yaml>本地配置
不同微服务之间能共享配置文件吗?
可以,不同微服务之间可以共享配置文件
spring:
cloud:
nacos:
config:
file-extension: yaml #文件后缀名
shared-configs: #多微服务间共享的配置列表
- dataId: common.yaml #要共享的配置文件
spring:
cloud:
nacos:
config:
file-extension: yaml #文件后缀名
extends-configs: #多微服务间共享的配置列表
- dataId: common.yaml #要共享的配置文件