服务注册与发现
1、简介
Nacos Discovery 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery 也将服务实例自身的一些元数据信息 – 例如 host,port,健康检查 URL,主页等内容注册到 Nacos。
2、学习目标
- 掌握 Nacos Discovery 实现 Spring Cloud 服务注册和发现
- 掌握 Nacos Discovery 整合 Spring Cloud 负载均衡和服务调用
- 理解 Nacos Discovery 高级特性:命名空间、安全控制、元数据、Nacos Watch 等
3、详细内容
- 快速上手:使用 Nacos Discovery 进行服务注册/发现
- 服务调用整合:实战 Nacos Discovery 整合
@LoadBalanced
RestTemplate 以及 Open Feign - 运维特性:演示 Nacos Discovery 高级外部化配置以及 Endpoint 内部细节
4、快速上手
4.1 引入 Nacos Discovery 进行服务注册/发现
有两种方式:
- 脚手架引入
- maven 依赖导入
直接访问沙箱环境,有准备好的案例代码
依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.2 使用 Nacos Discovery 进行服务注册/发现
增加 Maven 依赖
增加 Spring WebMVC 以及 Spring Boot Actuator Starter 依赖:
<!-- Spring WebMVC Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Actuator Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
完整配置
# 应用服务 WEB 访问端口
server.port=8080
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
spring.application.name=nacos-service
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
# Actuator Web 访问端口
management.server.port=8081
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
激活 Nacos Discovery 服务注册与发现
Aliyun Java Initializr 默认不会自动激活 Nacos Discovery 服务注册与发现,需要在引导类(main 方法所在类)标注 Spring Cloud 服务注册与发现标准注解:
@EnableDiscoveryClient
5、Nacos Discovery 整合 Spring Cloud 服务调用
从应用架构上,Spring Cloud 服务调用通常需要两个应用,一个为服务提供者 (Provider),一个为服务消费者(Consumer)。
从技术上,传统的 Spring Cloud 服务通讯方式是基于 REST 实现的,包好两种内建实现方法,分别是 @LoadBalanced
RestTemplate 以及 Open Feign,两者均作用于服务消费者,而服务提供者仅为 WebMVC 或者 WebFlux 应用(需注册到注册中心)。
同时,还允许整合 Spring Cloud 负载均衡 API,实现自定义 REST 服务调用。至于,Spring Cloud Alibaba 引入 Dubbo 服务通讯方式,会在后续内容中单独讨论。
第一种方式
服务消费者激活 Nacos Discovery 服务注册与发现
与应用 nacos-discovery-provider-sample 实现一样,在引导类上标注 @EnableDiscoveryClient
服务消费者使用 @LoadBalanced RestTemplate 实现服务调用
前文提到 @LoadBalanced
RestTemplate 是 Spring Cloud 内建的服务调用方式,因此需要在应用 nacos-discovery-consumer-sample 增加执行代码,消费应用 nacos-discovery-provider-sample REST 服务 /echo/{message}
。
故在引导类同包下新增 RestController 实现:
@RestController
public class RestTemplateController {
@LoadBalanced
@Autowired
public RestTemplate restTemplate;
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@GetMapping("/call/echo/{message}")
public String callEcho(@PathVariable String message) {
// 访问应用 nacos-service 的 REST "/echo/{message}"
return restTemplate.getForObject("http://nacos-service/echo/" + message, String.class);
}
}
第二种方式
整合 Spring Cloud OpenFeign
Spring Cloud OpenFeign 是 Spring Cloud 基于 REST 客户端框架 OpenFeign 而构建,使得服务发现和负载均衡透明,开发人员只需关注服务消费者接口契约。
同时,Spring Cloud OpenFeign 可以与 @LoadBalanced
RestTemplate 共存,因此,可在原有应用 nacos-discovery-consumer-sample 的基础上,增加 Maven 依赖和代码实现整合。
官方文档:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/
1 服务消费者添加依赖
<!-- Spring Cloud OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
2 新增 Spring Cloud OpenFeign 服务声明接口
@FeignClient("nacos-service") // 指向服务提供者应用
public interface EchoService {
@GetMapping("/echo/{message}")
String echo(@PathVariable("message") String message);
}
3 激活服务声明接口
仅需在引导类标注 @EnableFeignClients
,如果声明接口与引导类不在同一个包的话,请使用 basePackages
属性指定。
也可在同一包下新增一个配置类来实现激活
@Configuration
@EnableFeignClients // 激活 @FeignClient
public class NacosDiscoveryConsumerConfiguration {
}
4 实现服务调用
新增 OpenFeignController
类
@RestController
public class OpenFeignController {
@Autowired
private EchoService echoService;
@GetMapping("/feign/echo/{message}")
public String feignEcho(@PathVariable String message) {
return echoService.echo(message);
}
}
6、Nacos Discovery 更多配置项信息
参考博客:[Spring Cloud Nacos Discovery Starter配置项信息](https://blog.csdn.net/qq_39458487/article/details/123644720#:~:text=配置项 Key 默认值 说明 服务端地址 spring.cloud.nacos.discovery.server-addr 无 NacosServer,服务名 spring.cloud.nacos.discovery.service %24 {spring.application.name} 给当前的服务命名 服务分组 spring.cloud.nacos.discovery.group DEFAULT_GRO_spring.cloud.nacos.discovery.group)
7、Nacos Discovery Actuator Endpoint
执行器端点
Nacos Discovery 内部提供了一个 Endpoint, 对应的 endpoint id 为 nacos-discovery,其 Actuator Web Endpoint URI 为 /actuator/nacos-discovery
注:使用 Nacos Config Spring Cloud 1.x 版本的话,其 URI 地址则为
/nacos-discovery
Endpoint 暴露的 json 中包含了两种属性:
- subscribe: 显示了当前服务有哪些服务订阅者。
- NacosDiscoveryProperties: 当前应用 Nacos 的基础配置信息。
端口配置如下:
# 应用服务 WEB 访问端口
server.port=8080
# Actuator Web 访问端口
management.server.port=8081
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
直接访问:http://127.0.0.1:8081/actuator/nacos-discovery,服务响应的内容如下:
{
"subscribe":[
{
"jsonFromServer":"",
"name":"nacos-provider",
"clusters":"",
"cacheMillis":10000,
"hosts":[
{
"instanceId":"30.5.124.156#8081#DEFAULT#nacos-provider",
"ip":"30.5.124.156",
"port":8081,
"weight":1,
"healthy":true,
"enabled":true,
"cluster":{
"serviceName":null,
"name":null,
"healthChecker":{
"type":"TCP"
},
"defaultPort":80,
"defaultCheckPort":80,
"useIPPort4Check":true,
"metadata":{
}
},
"service":null,
"metadata":{
}
}
],
"lastRefTime":1541755293119,
"checksum":"e5a699c9201f5328241c178e804657e11541755293119",
"allIPs":false,
"key":"nacos-provider",
"valid":true
}
],
"NacosDiscoveryProperties":{
"serverAddr":"127.0.0.1:8848",
"endpoint":"",
"namespace":"",
"logName":"",
"service":"nacos-provider",
"weight":1,
"clusterName":"DEFAULT",
"metadata":{
},
"registerEnabled":true,
"ip":"30.5.124.201",
"networkInterface":"",
"port":8082,
"secure":false,
"accessKey":"",
"secretKey":""
}
}
参考书籍
重磅下载 | Java 开发者必备手册《Spring Cloud Alibaba 从入门到实战》,阿里双11同款!-阿里云开发者社区 (aliyun.com)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/189709.html