上文中我们学习到服务的注册,本文我们进行服务的调用及配置管理相关的实践
1. 服务调用实践
接着上篇文章的代码,我们新建模块nacos-service-consumer
- 在pom.xml目录下新增依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
</dependencies>
- 在resources目录下新建application.yml文件,内容如下
server:
port: 8071
spring:
application:
name: nacos-service-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 119f6bfd-adcf-4462-925b-7b412f287880
username: nacos
password: nacos
- 创建相关类,所在包目录会有所注释,不存在请自行创建
// package online.shenjian.nacos.consumer;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosServiceConsumerApplication.class, args);
}
}
// package online.shenjian.nacos.consumer.config;
@Component
public class RestTemplateConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
// package online.shenjian.nacos.consumer;
@RestController
public class HelloWorldController {
private final RestTemplate restTemplate;
public HelloWorldController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping(value = "/hello")
public String echo(@RequestParam String name) {
// 调用注册到nacos的服务,名称即spring.application.name指定的名称
return restTemplate.getForObject("http://nacos-service-provider/hello?name={name}", String.class, name);
}
}
- 在nacos-service-provider模块中加入包,主要是负载均衡,否则consumer调用会报unknown host异常
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
- 启动provider与consumer,访问
http://127.0.0.1:8071/hello?name=suanfaxiaosheng
得到如下响应,服务调用成功
代码均已提交至git上,之前有放过链接,后续文章代码均会在对应目录中,如果有任何问题,可以在公众号算法小生中与我沟通
2.配置管理实践
- 在nacos配置管理中命名空间suanfaxiaosheng中新建consumer.yaml配置,选择yaml配置格式,创建结果如下,会自动生成MD5摘要,每次修改均会变动
- 在consumer模块中在pom.xml新增依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
<!-- 2020.0.0及以后版本不在默认加载bootstrap 文件,需要手工添加[大坑] -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- 在consumer中新建bootstrap.yml
spring:
cloud:
nacos:
# 服务发现的部分也移动至这边,按照官网步骤来
discovery:
server-addr: 127.0.0.1:8848
namespace: 119f6bfd-adcf-4462-925b-7b412f287880
username: nacos
password: nacos
config:
# 是否支持配置管理
enabled: true
server-addr: 127.0.0.1:8848
namespace: 119f6bfd-adcf-4462-925b-7b412f287880
file-extension: yaml
# 多个配置文件的话可以是0 1 2这样依次配置,其中值越大,优先级越高,在yml中即靠后优先级高
extension-configs:
# 刚才在nacos配置管理中定义的data-id,注意带上文件扩展名
- data-id: consumer.yaml
group: DEFAULT_GROUP
# 默认不支持动态更新
refresh: true
- 在cosunmer中新建NacosConfig.java文件用于测试配置刷新
// package online.shenjian.nacos.consumer.config;
@RestController
@RequestMapping("/config")
// @RefreshScope动态刷新基于Cglib动态代理
@RefreshScope
@ConditionalOnProperty(name = "spring.cloud.nacos.config.enable", matchIfMissing = true)
public class NacosConfig {
@Value("${cache.useLocalCache:false}")
private boolean useLocalCache;
@GetMapping("/get")
public boolean getConfig() {
return useLocalCache;
}
}
- 访问
http://127.0.0.1:8071/config/get
后得到结果如下为true,说明nacos的配置生效
当我们修改cache.useLocalCache值为false并发布后,可以控制台打印消息如下且值已变更
- 我们在nacos配置管理->监听查询中,输入对应配置信息我们可以看到对应的IP及配置MD5信息
我们可以通过该MD5值与当前配置MD5比对,已检查配置变更是否推送到Client端
- 当然,在历史版本中,我们也可以选择先前的版本进行回滚配置