第07課:服務消費者

前面咱們提到,對外提供接口經過 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

因而可知,咱們成功調用了服務提供者提供的接口,而且循環調用不一樣的接口,說明它自帶了負載均衡效果。

相關文章
相關標籤/搜索