系列文章目录
第一章 Nacos实现配置中心
第二章 Nacos实现注册中心
目录
10.@FeignClient FallBackFactory降级
前言
欢迎来到 Nacos 的世界!
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
一、服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
。
二、使用步骤
1.启动服务发现
本节通过实现一个简单的 echo service
演示如何在您的 Spring Cloud 项目中启用 Nacos 的服务发现功能,如下图示:
2.引入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
3.application.properties 配置
server.port=8081
spring.application.name=nacos-prodiver
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
4.演示代码
通过 Spring Cloud 原生注解 @EnableDiscoveryClient
开启服务注册发现功能
代码如下(示例):
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
SysConfig sysConfig = applicationContext.getBean(SysConfig.class);
System.out.println("user name :" + sysConfig.getName() + "; age: " + sysConfig.getAge());
System.in.read();
}
@RestController
public class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
5.nacos 服务列表
6.Consumer 应用
通过 Spring Cloud 原生注解 @EnableDiscoveryClient
开启服务注册发现功能。给 RestTemplate 实例添加 @LoadBalanced
注解,开启 @LoadBalanced
与 Ribbon 的集成
application.properties
server.port=8082
spring.application.name=nacos-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
代码演示
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
/**
* 实例化 RestTemplate 实例
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class NacosController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/echo/app-name")
public String echoAppName() {
//使用 LoadBalanceClient 和 RestTemolate 结合的方式来访问
String url = String.format("http://nacos-prodiver/echo/%s", "hello world");
System.out.println("request url:" + url);
return restTemplate.getForObject(url, String.class);
}
}
}
7.OpenFeign 的使用
引入POM
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.netflix.archaius</groupId>
<artifactId>archaius-core</artifactId>
<version>0.7.6</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
EchoService
@FeignClient(name = "nacos-prodiver")
public interface EchoService {
@GetMapping(value = "/echo/{string}")
String echo(@PathVariable String string);
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
/**
* 实例化 RestTemplate 实例
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class NacosController {
@Resource
private EchoService echoService;
@GetMapping("/echo/app-name")
public String echoAppName() {
return echoService.echo("nacos");
}
}
}
8.@FeignClient标签的常用属性如下
- name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
- url: url一般用于调试,可以手动指定@FeignClient调用的地址
- decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
- configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
- fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
- fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
- path: 定义当前FeignClient的统一前缀,当我们项目中配置了server.context-path,server.servlet-path时使用
9.@FeignClient FallBack降级
不推荐:不能捕获异常打印堆栈信息,不利于问题排查
1.首先:我们在启动类里面加入注解,声明开启Feign的远程调用,如下:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
/**
* 实例化 RestTemplate 实例
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RestController
public class NacosController {
@Resource
private EchoService echoService;
/**
* http://127.0.0.1:8082//echo/app-name
*/
@GetMapping("/echo/app-name")
public String echoAppName() {
return echoService.echo("nacos");
}
}
}
2.编写接口类,value="/echo"就是我们服务方暴露的接口地址,如下:
@FeignClient(name = "nacos-prodiver",fallback = EchoServiceFallBack.class)
public interface EchoService {
@GetMapping(value = "/echo/{string}")
String echo(@PathVariable String string);
}
3.编写熔断类,发生错误时回调:
@Component
public class EchoServiceFallBack implements EchoService {
@Override
public String echo(String string) {
return string + " fall back";
}
}
4.定义配置信息:
feign:
client:
config:
metaDataClient:
connect-timeout: 3000
read-timeout: 3000
hystrix:
enabled: true
10.@FeignClient FallBackFactory降级
fallbackFactory 推荐:可以捕获异常信息并返回默认降级结果。可以打印堆栈信息。
@FeignClient(name = "nacos-prodiver",fallbackFactory = EchoServiceFactory.class)
public interface EchoService {
@GetMapping(value = "/echo/{string}")
String echo(@PathVariable String string);
}
@Component
public class EchoServiceFactory implements FallbackFactory<EchoService> {
@Override
public EchoService create(Throwable throwable) {
return new EchoService() {
@Override
public String echo(String string) {
return string + " fall back factory";
}
};
}
}
总结
参考
Nacos discovery · alibaba/spring-cloud-alibaba Wiki · GitHub