【前面的話】書接上文,本文的某些知識依賴個人第一篇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依賴:web
<parent> <artifactId>lovincloud</artifactId> <groupId>com.eelve.lovincloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <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>
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](https://my.oschina.net/u/570656):8881/eureka/ # 註冊到的eureka服務地址 feign: hystrix: enabled: true
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; /** * [@ClassName](https://my.oschina.net/u/3112573) SecurityConfig * @Description TDO * [@Author](https://my.oschina.net/arthor) zhao.zhilue * [@Date](https://my.oschina.net/u/2504391) 2019/8/16 14:13 * @Version 1.0 **/ @Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().permitAll() .and().csrf().disable(); } }
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; /** * @ClassName LovinFeignClientApplication * @Description TDO * @Author zhao.zhilue * @Date 2019/8/15 17:17 * @Version 1.0 **/ @SpringBootApplication @EnableFeignClients @EnableDiscoveryClient @EnableHystrix public class LovinFeignClientApplication { public static void main(String[] args) { SpringApplication.run(LovinFeignClientApplication.class,args); } }
package com.eelve.lovin.service; 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; /** * @ClassName FeignRemoteService * @Description TDO * @Author zhao.zhilue * @Date 2019/8/15 17:18 * @Version 1.0 **/ @FeignClient(value = "lovineurkaclient",fallback = FeignRemoteServiceImpl.class) public interface FeignRemoteService { @RequestMapping(value = "/hello",method = RequestMethod.GET) public String hello(); }
package com.eelve.lovin.hystrix; import com.eelve.lovin.service.FeignRemoteService; import org.springframework.stereotype.Component; /** * @ClassName FeignRemoteServiceImpl * @Description TDO * @Author zhao.zhilue * @Date 2019/8/15 17:31 * @Version 1.0 **/ @Component public class FeignRemoteServiceImpl implements FeignRemoteService { @Override public String hello() { return "hystrix起做用了"; } }
package com.eelve.lovin.controller; 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; /** * @ClassName FeignController * @Description TDO * @Author zhao.zhilue * @Date 2019/8/15 17:21 * @Version 1.0 **/ @RestController public class FeignController { @Autowired FeignRemoteService feignRemoteService; @GetMapping(value = "/getHello") public String getHello() { return feignRemoteService.hello(); } }
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> <version>2.1.2.RELEASE</version> </dependency>
package com.eelve.lovin; 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; /** * @ClassName LovinFeignClientApplication * @Description TDO * @Author zhao.zhilue * @Date 2019/8/15 17:17 * @Version 1.0 **/ @SpringBootApplication @EnableFeignClients @EnableDiscoveryClient @EnableHystrix @EnableHystrixDashboard public class LovinFeignClientApplication { public static void main(String[] args) { SpringApplication.run(LovinFeignClientApplication.class,args); } @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; } }
默認的集羣監控:經過URL http://turbine-hostname:port/turbine.stream開啓,實現對默認集羣的監控。 指定的集羣監控:經過URL http://turbine-hostname:port/turbine.stream?cluster=[clusterName]開啓,實現對clusterName的監控。 單體應用監控:經過URL http://hystrix-app:port/hystrix.stream開啓,實現對某個具體的服務監控
這樣咱們就完成了熔斷器的監控,固然具體含義有待下一步深究。spring