0. 栗子代码仓:
1. Nacos本地环境搭建及启动
1.1. Nacos下载
下载链接:Linux下载第一个,windows下载第二个
1.2. Nacos启动
- 解压后进入bin目录,地址栏执行cmd
- 执行命令:
startup.cmd -m standalone
- 上述命令的standalone表示单机启动,集群的配置自行百度
1.3. Nacos访问控制台页面:
访问上述地址,或者http://localhost:8848/nacos 默认账号/密码:nacos/nacos
2. 项目框架依赖说明:
- SpringBoot版本:2.3.2.RELEASE
- SpringCloud版本:Hoxton.SR8
- Spring-Cloud-Alibaba版本:2.2.5.RELEASE
- Spring Cloud Alibaba的相关介绍可以参考链接:Spring Cloud Alibaba介绍 ;下图是推荐的版本依赖关系:
2.1. naocs主要依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-alibaba-dependencies}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba-dependencies}</version>
</dependency>
3. 提供者代码说明:
3.1. bootstrap.yaml:
spring:
# 项目名称,默认情况下Nacos中配置需要和这个保持一致
application:
name: provider
cloud:
nacos:
# 配置
config:
# Nacos地址
server-addr: 127.0.0.1:8848
# 发布服务时需要加上这个,不然Nacos无法监听到
discovery:
# Nacos地址
server-addr: 127.0.0.1:8848
server:
port: 8080
3.2. 提供者Controller:
${name}取的是nacos配置管理的值,下文第3.3节会有配置
@RequestMapping("/provider")
@RestController
class ProviderController {
@Value("${name}")
private String name;
@NacosInjected
private NamingService namingService;
@Autowired
private NacosServiceManager nacosServiceManager;
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
@GetMapping("/getValue")
public String getValue(){
return "[name: " + name + "]";
}
@RequestMapping(value = "/getService", method = GET)
public List<Instance> get(@RequestParam String serviceName) throws NacosException {
// namingService注入为null,采用nacosServiceManager获取namingService注入为null
namingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties());
return namingService.getAllInstances(serviceName);
}
}
3.3. nacos配置管理配置:
访问控制台 – 配置管理 – 添加配置
Data ID对应的完整配置如下:
- 此处Data ID与服务spring.service.name一致;Group为默认即可
- 配置格式为yaml,本栗子只配置name: zhangsan,配置完成发布即可
3.4. 启动提供者:
启动提供者的启动类,访问接口:http://localhost:8080/provider/getValue
查看nacos控制台,服务列表,可见提供者注册上去了
4. 消费者代码说明:
消费者调用提供者的getValue接口,可以使用RestTemplate或者Feign来调用
4.1. 补充openfeign依赖:
在消费者的pom,下添加如下依赖:
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
4.2. 创建提供者的Feign接口:
注释的内容是相对应的,如果@FeignClient中值与spring.service.name对应;不使用url时,Mapping路径为提供者的接口全路径
@FeignClient("provider")
//@FeignClient(name = "provider",url = "http://localhost:8080/provider")
public interface ProviderClient {
@GetMapping("/provider/getValue")
// @GetMapping("/getValue")
String getValue();
}
4.3. 消费者Controller:
直接注入Feign接口调用接口即可,会匹配到注册到nacos的提供者接口
@RequestMapping("/consumer")
@Controller
class ConsumerController {
@Autowired
ProviderClient providerClient;
@GetMapping("/getValue")
@ResponseBody
public String getValue(){
RestTemplate restTemplate = new RestTemplate();
String forObject = restTemplate.getForObject("http://127.0.0.1:8080/provider/getValue", String.class);
System.out.println("------------getValue消费者-------------------");
return forObject;
}
@GetMapping("/getFeignValue")
@ResponseBody
public String getFeignValue(){
System.out.println("------------getFeignValue消费者-------------------");
return providerClient.getValue();
}
}
4.4. 消费者启动类:
消费者启动类添加
@EnableFeignClients
注解:
启动消费者启动类,访问消费者接口:http://localhost:8081/consumer/getFeignValue idea控制台有输出,有返回值
同样,在nacos控制台的服务列表,消费者也注册上去
本栗子简单的demo结束~
5. 命名空间namespace:
Nacos提供了namespace来实现环境隔离功能,每个空间里面的配置是独立的 (默认是 public)
命名空间下还有组Group和Service等隔离手段
5.1. 创建命名空间namespace:
创建一个dev开发环境:
5.2. 创建配置数据:
像3.3一样,为dev空间进行配置管理,这里面配置了name: zhangsan-dev
5.3. 代码yaml配置命名空间namespace:
- 在代码yml文件配置namespace,值为命名空间id,
# 提供者的yml文件配置
spring:
# 项目名称,默认情况下Nacos中配置需要和这个保持一致
application:
name: provider
cloud:
nacos:
# 配置
config:
# Nacos地址
server-addr: 127.0.0.1:8848
namespace: a0d85536-6299-4e36-93bf-bfd567c765ca # 命名空间,填ID
# 发布服务时需要加上这个,不然Nacos无法监听到
discovery:
# Nacos地址
server-addr: 127.0.0.1:8848
cluster-name: SZ # 集群名称
namespace: a0d85536-6299-4e36-93bf-bfd567c765ca # 命名空间,填ID
server:
port: 8080
# 消费者的yml
spring:
application:
name: consumer
cloud:
nacos:
# 配置
config:
# Nacos地址
server-addr: 127.0.0.1:8848
# 发布服务时需要加上这个,不然Nacos无法监听到
discovery:
# Nacos地址
server-addr: 127.0.0.1:8848
cluster-name: SZ # 集群名称
namespace: a0d85536-6299-4e36-93bf-bfd567c765ca # 命名空间,填ID
register-enabled: false # 只消费不注册
server:
port: 8081
- 如果只读取配置值,那么只在config进行配置namespace即可,如果还有进行服务发现,则discovery也需要配置
- 像提供者Controller中要读取了配置name,也要给消费者消费,就要都配置
- 而消费者是并不需要读取配置的值,需要掉提供者进行服务发现,所以一定要在discovery配置namespace
- 一般二者都添加
启动消费者启动类,访问消费者接口:http://localhost:8081/consumer/getFeignValue 返回dev环境的配置值
6. 消费者只进行消费,而不注册
- 很多时候,我们本地调用线上稳定环境进行调试,我们是不应该把本地的服务注册上去的,避免线上服务调用到本地
- 这时,我们需要在消费者增加spring.cloud.nacos.discovery.register-enabled为false,见上述5.3配置文件
- 这时,我们能正常调用提供者接口,但并没有注册到nacos上,如下图(可对比4.4):
7. 订阅者
这里的消费者并不是就是指消费者,具体可以百度了解
- 点击上图订阅者,需要在消费者配置jvm启动参数
-Dproject.name=“ConsumerApplication”
,才会识别,不然是unknown
8. 集群权重:
- 有些机器性能较好,处理较快,这时我们希望更多的请求在性能较好的实例中处理,
- Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
- 点击6图中的详情,进行权重编辑;此处也可以对服务进行下线,比如本地服务注册上去了,就下线它:
9. @RefreshScope 实现配置自动更新:
- 在nacos配置中心更改了配置值,添加该注解,服务就可以很快感知到配置修改,进而读取最新配置值,具体原理感兴趣可以百度