前言
上篇文章中,简单介绍了 如何在 SpringCloud 项目中接入 Nacos 作为注册中心
,其中服务消费者是通过 RestTemplate+Ribbon 的方式来进行服务调用的。
实际上在日常项目中服务间调用大都用的是OpenFeign
, OpenFeign 自身整合了 Ribbon 和 Hystrix,为服务调用提供了更优雅的方式
那么接入了 Nacos 之后,服务调用还能用这一套吗?
通过我在公司项目上的试水,这个大胆的设想是完全没问题的
本文在上一篇文章中的项目工程基础上,进行测试和演示,文章地址:在 SpringCloud 项目中接入 Nacos 作为注册中心
创建项目
打开之前创建的工程 Nacos,目前已经有两个子工程:
- nacos-provide:服务提供者
- nacos-consumer:服务消费者(RestTemplate+Ribbon 服务调用)
同样的操作,在 Nacos 项目下继续创建一个 Springboot 项目名为 nacos-feign,创建时添加 OpenFeign 的依赖,如图:
nacos-fegin 的 pom.xml 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>Nacos</artifactId>
<groupId>com.study.www</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.larscheng.www</groupId>
<artifactId>nacos-fegin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-fegin</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
定义远程接口
创建 RemoteClient 接口,来定义 OpenFeign 要调用的远程服务接口。
同时通过 @FeginClient 注解指定被调用方的服务名,通过 fallback 属性指定 RemoteHystrix 类,来进行远程调用的熔断和降级处理。
RemoteClient.java 代码如下
@FeignClient(name = "nacos-provide",fallback = RemoteHystrix.class)
public interface RemoteClient {@GetMapping("/helloNacos")
String helloNacos();}
RemoteHystrix.java 代码如下
@Component
public class RemoteHystrix implements RemoteClient {
@Override
public String helloNacos() {return "请求超时了";}
}
通过 OpenFeign 调用远程服务
在启动类 NacosFeignApplication.java 中添加注解 @EnableDiscoveryClient 开启服务注册、添加注解 @EnableFeignClients 开启 OpenFeign,启动类通过 OpenFeign 调用服务代码如下
@SpringBootApplication
@RestController
@EnableDiscoveryClient
@EnableFeignClients
public class NacosFeignApplication {public static void main(String[] args) {SpringApplication.run(NacosFeginApplication.class, args);
}
@Autowired
private RemoteClient remoteClient;
@GetMapping("/feign")
public String test() {return remoteClient.helloNacos();
}
}
添加项目配置文件
在 resourse 目录下,添加 application.yml 配置
server:
port: 9529
spring:
application:
name: nacos-feign
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
启动测试
- 启动 Nacos-server
- 启动项目 nacos-provide
- 启动项目 nacos-feign
完成以上三步后,访问 Nacos 控制台,检查服务注册情况,如果启动都成功,你看到的应该是如下图:
浏览器访问 http://127.0.0.1:9529/feign,可以看到返回结果与 RestTemplate 结果无异,但对于编码和操作方式都更加优雅。
访问 nacos-feign 的接口 http://127.0.0.1:9529/feign,可以通过 OpenFeign 远程调用 nacos-provide 的接口,返回结果:
你好,nacos!
总结
OpenFegin 整合 Ribbon 和 Hystrix,为微服务中远程调用提供了一种更优雅的调用方式,它支持负载均衡和容错熔断机制。通过上面的例子,在 SpringCloud 中接入 Nacos 做注册中心后,并不会影响我们继续使用其他 SpringCloud 组件。
本文源码:https://github.com/larscheng/…