我使用的 SpringCloud 版本为 Hoxton.SR3
服务消费方使用
第一步: 引入 Feign 依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- </dependency>
第二步: 启用 Feign, 在启动类添加开启的注解
- package com.company;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.SpringCloudApplication;
- import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
- import org.springframework.cloud.client.loadbalancer.LoadBalanced;
- import org.springframework.cloud.netflix.ribbon.RibbonClient;
- import org.springframework.cloud.openfeign.EnableFeignClients;
- import org.springframework.context.annotation.Bean;
- import org.springframework.web.client.RestTemplate;
- //@EnableDiscoveryClient // 启用 Eureka 客户端
- //@SpringBootApplication
- //@EnableCircuitBreaker // 启用 Hystrix 熔断功能
- @SpringCloudApplication // 替代以上三个注解
- @EnableFeignClients // 启用 Feign
- public class ConsumerApplication {
- public static void main(String[] args) {
- SpringApplication.run(ConsumerApplication.class);
- }
- // 启用 Feign 以后无需再注入
- // @Bean
- // @LoadBalanced
- // public RestTemplate restTemplate(){
- // return new RestTemplate();
- // }
- }
第三步: 写一个 Feign 的客户端
- package com.company.client;
- import org.springframework.cloud.openfeign.FeignClient;
- import org.springframework.Web.bind.annotation.GetMapping;
- import org.springframework.Web.bind.annotation.PathVariable;
- @FeignClient("user-service")// 声明这是一个 Feign 的客户端接口, value 指明服务 id
- public interface UserFeignClient {
- // 使用 SpringMVC 的注解指明请求方式, 请求路径, 请求参数和响应类型
- @GetMapping("/user/{id}")
- public String getUserById(@PathVariable(name = "id") Long id);
- }
第四步: 改造消费方的调用方式
- package com.company.controller;
- import com.company.client.UserFeignClient;
- import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
- import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.cloud.client.discovery.DiscoveryClient;
- import org.springframework.Web.bind.annotation.GetMapping;
- import org.springframework.Web.bind.annotation.PathVariable;
- import org.springframework.Web.bind.annotation.RequestMapping;
- import org.springframework.Web.bind.annotation.RestController;
- import org.springframework.Web.client.RestTemplate;
- @RestController
- @RequestMapping("/consumer3")//Feign
- @Slf4j
- @DefaultProperties(defaultFallback = "getUserByIdFallBack")
- public class ConsumerController3 {
- @Autowired
- private UserFeignClient feignClient;
- @GetMapping("/{id}")
- @HystrixCommand
- public String getUserById(@PathVariable("id")Long id){
- long start=System.currentTimeMillis();
- String user = feignClient.getUserById(id);
- long end=System.currentTimeMillis();
- log.debug("调用时长:{}",end-start);
- return user;
- }
- public String getUserByIdFallBack(){
- return "很抱歉, 服务器 3 正忙, 请稍后再试.";
- }
- }
熔断依旧可用.
来源: http://www.bubuko.com/infodetail-3483823.html