SpringCloud Feign声明式服务调用
SpringCloud Feign聲明式服務調用
- 1. 加入pom依賴
- 2. Application.java上聲明@EnableFeignClients
- 3. @FeignClient聲明接口調用服務名,(SpirngMVC綁定方法,可有可無)
- 4. Feign負載均衡是通過ribbon實現的
- 5. 常見問題與解決
- 6. 小技巧,可調試用
- 參考
1. 加入pom依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
2. Application.java上聲明@EnableFeignClients
表示允許聲明式feign調用
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients(basePackages = { "com.service.client.feign.inter" })
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
3. @FeignClient聲明接口調用服務名,(SpirngMVC綁定方法,可有可無)
接口@FeignClient注解指定服務名來綁定服務,然后再使用Spring MVC的注解來綁定具體該服務提供的REST接口。
@FeignClient("hello-service-provider")
public interface HelloServiceFeign {@RequestMapping(value = "/demo/getHost", method = RequestMethod.GET)public String getHost(String name);@RequestMapping(value = "/demo/postPerson", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")public Person postPerson(String name);
注意,(SpirngMVC綁定方法,可有可無),若寫則@RequestMapping需要寫全面,假如XXInterface中Controller層也有 @RestController, @RequestMapping("/hello")
則應該為:
@FeignClient("hello-service-provider")
public interface HelloServiceFeign {@RequestMapping(value = "/hello/demo/getHost", method = RequestMethod.GET)public String getHost(String name);@RequestMapping(value = "/hello/demo/postPerson", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")public Person postPerson(String name);
}
4. Feign負載均衡是通過ribbon實現的
Spring Cloud Feign的客戶端負載均衡是通過Spring Cloud Ribbon實現的,可以直接配置Ribbon客戶端的方式來自定義各個服務客戶端調用參數。
Spring Cloud Ribbon默認負載均衡策略是輪詢策略,不過該不一定滿足我們的需要。Ribbon一共提供了7種負載均衡策略,如果我們需要ZoneAvoidanceRule,首先要在application.properties文件中添加配置,如下所示:
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.ZoneAvoidanceRule
不過,只是添加了如上配置,還無法實現負載均衡策略的更改。還需要實例化該策略,可以在應用主類中直接加入IRule實例的創建,如下:
/*** 服務調用者,,eureka客戶端 feign調用** @version* @since 1.8*/
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients(basePackages = { "com.client.feign.inter" })
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Beanpublic IRule feignRule() {return new ZoneAvoidanceRule();}
}
5. 常見問題與解決
- 遇到404,檢查@GetMapping中url
- 超時,application.yml配置ribbon
- 還報超時,訪問不到,有可能跨域問題
在controller層增加 @CrossOrigin;
- 沒報錯,就是返回結果不是期望的值,有可能程序中間有異常報錯
日志如上,被調用的服務日志打印完全一致,結果不是想要的,最后發現是程序后續處理過程有bug…;
6. 小技巧,可調試用
在url處配置服務的ip與端口,調試程序問題;
@FeignClient(name="hello-service-provider",url="http://xxx.xxx.xxx.xxx/")
public interface HelloServiceFeign {@RequestMapping(value = "/hello/demo/getHost", method = RequestMethod.GET)public String getHost(String name);@RequestMapping(value = "/hello/demo/postPerson", method = RequestMethod.POST, produces = "application/json; charset=UTF-8")public Person postPerson(String name);
}
參考
- https://www.jianshu.com/p/59295c91dde7
總結
以上是生活随笔為你收集整理的SpringCloud Feign声明式服务调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java IDEA import sun
- 下一篇: Python,OpenCV图像处理超好用