【前面的話】書接上文,本文的某些知識依賴個人第一篇SpringCLoud的文章:SpringCloud之Eureka,若是沒有看過能夠先移步去看一下。另外在微服務架構中,業務都會被拆分紅一個個獨立的服務,服務與服務的通信是基於http restful的。Spring cloud有兩種服務調用方式,一種是ribbon+restTemplate,另外一種是feign。上一篇文章已經講過ribbon+rest這種方式了,這一片博文主要講feign的應用。java
Feign是一個聲明式的僞Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只須要建立一個接口並註解。它具備可插拔的註解特性,可以使用Feign 註解和JAX-RS註解。Feign支持可插拔的編碼器和解碼器。Feign默認集成了Ribbon,並和Eureka結合,默認實現了負載均衡的效果。git
簡而言之:github
新建一個feign子工程lovin-feign-client,用於後面的操做。下面是主要的pom依賴:~~~pom
<artifactId>lovin-feign-client</artifactId>
<version>0.0.1</version>
<name>lovinfeignclient</name>
<description>feignclient測試</description>複製代碼
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
</dependencies>複製代碼
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
~~~
- 這裏爲了安全,我這裏仍是添加**spring-boot-starter-security**
~~~yaml
server:
port: 8806 # 服務端口號
spring:
application:
name: lovinfeignclient # 服務名稱
security:
basic:
enabled: true
user:
name: lovin
password: ${REGISTRY_SERVER_PASSWORD:lovin}
eureka:
client:
serviceUrl:
defaultZone: http://lovin:lovin@localhost:8881/eureka/ # 註冊到的eureka服務地址
feign:
hystrix:
enabled: true
~~~
- 配置**spring-boot-starter-security**,這裏爲了方便我這裏放開全部請求
~~~java
package com.eelve.lovin.config;複製代碼
import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;spring
/**安全
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll()
.and().csrf().disable();
}
}
~~~
- 在主類上添加**@EnableFeignClients**和**@EnableHystrix** ,固然也須要註冊到註冊中心:
~~~java
package com.eelve.lovin;複製代碼
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.hystrix.EnableHystrix;import org.springframework.cloud.openfeign.EnableFeignClients;restful
/**網絡
import com.eelve.lovin.hystrix.FeignRemoteServiceImpl;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;架構
/**app
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String hello();
}
~~~
- 添加熔斷器調用方法:新建**FeignRemoteServiceImpl**實現**FeignRemoteService**接口:
~~~java
package com.eelve.lovin.hystrix;複製代碼
import com.eelve.lovin.service.FeignRemoteService;import org.springframework.stereotype.Component;
/**
import com.eelve.lovin.service.FeignRemoteService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;
/**
@Autowired
FeignRemoteService feignRemoteService;複製代碼
@GetMapping(value = "/getHello")
public String getHello() {
return feignRemoteService.hello();
}
}
~~~
# 叄、啓動測試
- 依次啓動eureka的服務端和兩個客戶端,以及新建的lovin-feign-client

咱們能夠看到服務已經所有啓動成功
- 而後訪問http://localhost:8806/getHello

咱們能夠看到已經能夠經過feign調到咱們創建的eureka客戶端了
- 再次請求接口觀察返回

咱們能夠看到咱們調到了經過feign調用ribbon負載的另一個接口了,到這裏咱們就已經弄好了一個簡單的ribbon負載。複製代碼
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.hystrix.EnableHystrix;import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;import org.springframework.cloud.openfeign.EnableFeignClients;import org.springframework.context.annotation.Bean;
/**
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/actuator/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}
~~~
- 訪問http://localhost:8806/hystrix

這裏咱們經過首頁能夠看到:
~~~
默認的集羣監控:經過URL http://turbine-hostname:port/turbine.stream開啓,實現對默認集羣的監控。
指定的集羣監控:經過URL http://turbine-hostname:port/turbine.stream?cluster=[clusterName]開啓,實現對clusterName的監控。
單體應用監控:經過URL http://hystrix-app:port/hystrix.stream開啓,實現對某個具體的服務監控
~~~
- 添加監控模式查看詳情,這裏選擇第三個單體應用複製代碼
這樣咱們就完成了熔斷器的監控,固然具體含義有待下一步深究。
---