前言
上篇文章中,簡單介紹了如何在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/larscheng-learning-demo/tree/master/Nacos