前面咱們提到,對外提供接口經過 zuul 服務網關實現。一個大型的系統由多個微服務模塊組成,各模塊之間不可避免須要進行通訊,通常咱們能夠經過內部接口調用的形式,服務 A 提供一個接口,服務 B 經過 HTTP 請求調用服務 A 的接口,爲了簡化開發,Spring Cloud 提供了一個基礎組件方便不一樣服務之間的 HTTP 調用,那就是 Feign。spring
什麼是 Feignapi
Feign 是一個聲明式的 HTTP 客戶端,它簡化了 HTTP 客戶端的開發。使用 Feign,只須要建立一個接口並註解,就能很輕鬆的調用各服務提供的 HTTP 接口。Feign 默認集成了 Ribbon,默認實現了負載均衡。app
建立 Feign 服務負載均衡
在根項目上建立一個 module,命名爲 feign,而後在 pom.xml 添加以下內容:spring-boot
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> </dependencies>
建立 application.yml,內容以下:微服務
eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8081 spring: application: name: feign
最後建立一個啓動類 Application:單元測試
@SpringBootApplication @EnableEurekaClient @EnableFeignClients public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
咱們能夠看到啓動類增長了一個新的註解:@EnableFeignClients,若是咱們要使用 Feign 聲明式 HTTP 客戶端,必需要在啓動類加入這個註解,以開啓 Feign。測試
這樣,咱們的 Feign 就已經集成完成了,那麼如何經過 Feign 去調用以前咱們寫的 HTTP 接口呢?請看下面的作法。code
首先建立一個接口 ApiService,而且經過註解配置要調用的服務地址:server
@FeignClient(value = "eurekaclient") public interface ApiService { @RequestMapping(value = "/index",method = RequestMethod.GET) String index(); }
分別啓動註冊中心 EurekaServer、服務提供者EurekaClient(這裏服務提供者啓動兩次,端口分別爲876二、8763,以觀察 Feign 的負載均衡效果)。
而後在 Feign 裏面經過單元測試來查看效果。
1.添加單元測試依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
2.添加測試代碼。
@SpringBootTest(classes = Application.class) @RunWith(SpringJUnit4ClassRunner.class) public class TestDB { @Autowired private ApiService apiService; @Test public void test(){ try { System.out.println(apiService.index()); }catch (Exception e){ e.printStackTrace(); } } }
最後分別啓動兩次單元測試類,咱們能夠發現控制檯分別打印以下信息:
Hello World!,端口:8762 Hello World!,端口:8763
因而可知,咱們成功調用了服務提供者提供的接口,而且循環調用不一樣的接口,說明它自帶了負載均衡效果。