Feign是一个声明式的Web Service客户端,比Ribbon好用,默认也是轮巡。我们只需要使用Feign创建一个接口,并用注解就好了。如果你基于spring cloud发布一个接口,实际上就是支持http协议的,对外发布的就是一个最普通的mvc的http接口。我们使用feign注解,实际上它会对这个接口生成动态代理,从eureka的readonly中拿到其他服务信息、进行http请求调用。

feign案例编写:

1. 导包

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.5.8.RELEASE</version>
  5. <relativePath/>
  6. </parent>
  7. <!-- springcloud依赖 -->
  8. <dependencyManagement>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-dependencies</artifactId>
  13. <version>Dalston.SR3</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. </dependencies>
  18. </dependencyManagement>
  19.  
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <!-- eureka客户端依赖 -->
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-eureka</artifactId>
  29. </dependency>
  30. <!-- feign客户端 -->
  31. <dependency>
  32. <groupId>org.springframework.cloud</groupId>
  33. <artifactId>spring-cloud-starter-feign</artifactId>
  34. </dependency>
  35. </dependencies>

2. 配置application.yml文件

  1. # 项目访问路径前缀
  2. server:
  3. context-path: /feign
  4. port: 8085
  5.  
  6. # 设置服务名称,服务会以这个名字注册到eureka服务器上
  7. spring:
  8. application:
  9. name: feign
  10.  
  11. # 设置eureka服务器的注册地址
  12. eureka:
  13. client:
  14. serviceUrl:
  15. defaultZone: http://localhost:8761/eureka/
  16.  
  17. #ribbon的超时时间, 防止feign调用超时
  18. ribbon:
  19. ReadTimeout: 15000
  20. ConnectTimeout: 15000
  21. MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
  22. MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
  23. OkToRetryOnAllOperations: false #是否所有操作都重试

3. 主函数入口开启eureka和feign客户端

  1. @SpringBootApplication
  2. @EnableEurekaClient//开启eureka
  3. @EnableFeignClients//开启feign
  4. public class FeignMain {
  5.  
  6. public static void main(String[] args) {
  7. new SpringApplicationBuilder(FeignMain.class).web(true).run(args);
  8. }
  9. }

4. 调用接口

  1. @RestController
  2. public class UserController {
  3.  
  4. @Autowired
  5. private UserService userService;
  6.  
  7. @RequestMapping("/test")
  8. public Map test() {
  9. return userService.test("张三");
  10. }
  11.  
  12. @RequestMapping("/testObj")
  13. public User testObj() {
  14. return userService.testObj(new User());
  15. }
  16. }

5. 编写feign调用的服务层。

  1. import java.util.Map;
  2. import org.springframework.cloud.netflix.feign.FeignClient;
  3. import org.springframework.web.bind.annotation.RequestBody;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RequestParam;
  6. import com.model.User;
  7. //name 目标的服务名 目标的url前缀
  8. @FeignClient(name ="demo",path="/demo")
  9. public interface UserService {
  10.  
  11. // 调用police服务的testOut接口
  12. @RequestMapping("/testOut")
  13. public Map test(@RequestParam("name") String name);
  14.  
  15. // 调用police服务的testOutObj接口
  16. @RequestMapping("/testOutObj")
  17. public User testObj(@RequestBody User user);
  18. }

feign客户端就开发完成了; 我们来看看提供服务的另一个项目的接口。

  1. @RestController
  2. public class MyController {
  3.  
  4. @RequestMapping("/testOut")
  5. public Map test(@RequestParam("name") String name,HttpServletRequest req) {
  6. Map m = new HashMap<>();
  7. m.put("url", req.getRequestURL().toString());
  8. m.put("name", name);
  9. try {
  10. Thread.sleep(16000);
  11. } catch (InterruptedException e) {
  12. }
  13. return m;
  14. }
  15.  
  16. @RequestMapping("/testOutObj")
  17. public User testObj(@RequestBody() User user,HttpServletRequest req) {
  18. user.setUrl(req.getRequestURL().toString());
  19. try {
  20. Thread.sleep(14000);
  21. } catch (InterruptedException e) {
  22. }
  23. return user;
  24. }
  25. }

测试: 由于超时时间设置的15s, 而两个接口分别阻塞14s ,16s ,所以第二个接口会超时报错。

Feign负载均衡的更多相关文章

  1. java框架之SpringCloud(4)-Ribbon&Feign负载均衡

    在上一章节已经学习了 Eureka 的使用,SpringCloud 也提供了基于 Eureka 负载均衡的两种方案:Ribbon 和 Feign. Ribbon负载均衡 介绍 SpringCloud ...

  2. SpringCloud 进阶之Ribbon和Feign(负载均衡)

    1. Ribbon 负载均衡 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端,负载均衡的工具; 1.1 Ribbon 配置初步 1.1.1 修改 micros ...

  3. SpringCloud之Feign 负载均衡请求超时时间

    版本声明: SpringCloud:Greenwich.SR4 SpringBoot:2.1.9.RELEASE Feign调用服务的默认时长是1秒钟,也就是如果超过1秒没连接上或者超过1秒没响应,那 ...

  4. SpringCloud学习(5)——Feign负载均衡

    Feign概述 Feign是声明式的Web服务客户端, 使得编写Web服务客户端变的非常容易, 只需要创建一个接口, 然后在上面添加注解即可. Feign旨在使编写Java Http客户端变的更容易. ...

  5. Feign负载均衡(五)

    一.Feign定义 Feigin是服务消费者,Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解.它具有可插拔的注解特性,可使用Fei ...

  6. 4.Spring Cloud初相识--------Feign负载均衡

    前言: 在上一节里,我们学习了ribbon的使用. 我们了解到ribbon是一个客户端负载均衡机制. 而我们今天要讲的Feign呢,也是一款客户端负载均衡机制. 或者这样说,Feign封装了ribbo ...

  7. feign 负载均衡熔断器

    feign:和zuul配合进行负载均衡. 注解的含义: @EnableDiscoveryClient 声明它是一个资源服务端,即可以通过某些接口调用一些资源: @EnableFeignClients ...

  8. Feign 负载均衡

    一.是什么 Feign 是一个声明式 WebService 客户端.使用 Feign 能让编写 Web Service 客户端更加简单,他的使用方法是定义一个接口,然后在上面添加注解.同时也支持 JA ...

  9. SpringCloud之Feign负载均衡(四)

    整合Feign pom.xml <dependency> <groupId>org.springframework.cloud</groupId> <arti ...

  10. SpringCloud的入门学习之概念理解、Feign负载均衡入门

    1.Feign是SpringCloud的一个负载均衡组件. Feign是一个声明式WebService客户端.使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口, ...

随机推荐

  1. ESP8266-12F

    读者可以把ESP8266当做Arduino+WiFi功能来开发 ESP8266模块支持STA/AP/STA+AP 三种工作模式: STA 模式:ESP8266模块通过路由器连接互联网,手机或电脑通过互 ...

  2. Python---进阶---文件操作---按需求打印文件的内容

    一. 编写一个程序,当用户输入文件名和行数的时候,将该文件的前N行内容打印到屏幕上 input 去接收一个文件名 input 去接收一个行数 ----------------------------- ...

  3. USACO Overplanting ( 线段树扫描线 )

    题意 : 在二维平面上给出 N 个矩形,问你所有矩形构成的图案的面积是多少(相互覆盖的地方只计算一次) 分析 :  求矩形面积并可以模拟来做,不过使用线段树来辅助做扫描线可以更高效地求解 扫描线顾名思 ...

  4. JS中包含6种错误类型

    1.SyntaxError(语法错误) 解析代码时发生的语法错误 eg:var 1a; Uncaught SyntaxError: Unexpected number 2.ReferenceError ...

  5. 【bzoj1146】[CTSC2008]网络管理Network

    题目描述: M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  6. 从源码编译UE4,加快Setup.bat下载文件的环节

    之前很傻,每次运行这个setup.bat都要等很久很久才能把4g多的东西下载完成,知道有一天突然发现了世外桃源…… 从命令行运行setup.bat -help,可以看到参数的说明(没错,参数可选,之前 ...

  7. open 函数处理文件

    open函数用于文件处理 操作文件时,一般需要经历如下步骤:1 打开文件    2  操作文件 f =  open("文件名"     ,  '  打开文件方式'  ) 文件句柄 ...

  8. cefsharp 在高DPI下闪烁的问题

    今天有客户朋友说程序在他的surface下界面很闪烁,搜索了相关的资料,初步判定是DPI引起的问题,但也有可能是cefsharp 51版本在WIN10上面没有禁用GPU加速,苦于没有环境测试,所以抱着 ...

  9. java虚拟机规范-加载、链接与初始化

    前言 java虚拟机是java跨平台的基石,本文的描述以jdk7.0为准,其他版本可能会有一些微调.java代码本身并不能为jvm识别,实际上在jvm中的表现形式为Class对象,一个java类从字节 ...

  10. 字符串处理工具Guava使用总结

    字符串处理工具Guava使用总结 在java开发过程中对字符串的处理是非常频繁的,google的guava工具对字符串的一些处理进行优化,使我们开发过程中让自己的代码看去更加美观,清爽. 1:mave ...