上一篇博客我们使用ribbon+restTemplate实现负载均衡调用服务,接下来我们使用feign实现服务的调用,首先feign和ribbon的区别是什么呢?

  ribbon根据特定算法,从服务列表中选取一个要访问的服务;

  1. RoundRobinRule:轮询
  2. RandomRule:随机
  3. AvailabilityFilteringRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发的连接数量,超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问;
  4. WeightedResponseTimeRule: 根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的机率越高,刚启动时,如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够时,会切换到WeightedResponseTimeRule
  5. RetryRule: 先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定时间内会进行重试,获取可用的服务;
  6. BestAvailableRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
  7. ZoneAvoidanceRule: 默认规则,复合判断server所在区域的性能和server的可用性选择服务器;

Spring Cloud Netflix 的微服务都是以 HTTP 接口的形式暴露的,所以可以用 Apache 的 HttpClient 或 Spring 的 RestTemplate 去调用, Feign 是一个使用起来更加方便的 HTTP 客戶端,使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法。接下来我们简单使用一下Feign:

前提:有两个服务,一个movie,一个user,user运行在多个端口(模拟多台机器部署服务)。

 首先引入Feign依赖

  

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

第二步:在movie服务中写一个接口UserInterface.java,调用user服务,接口代码如下:

package com.xing.movie.FeignInteface;import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.xing.movie.entity.User;@FeignClient("xing-user")//服务名
public interface UserInterface {@RequestMapping(value ="/user/findByNameEn/{nameEn}" ,method =RequestMethod.GET )//必须使用RequestMapper,使用GetMapping启动报错public User findByNameEn(@PathVariable("nameEn") String nameEn);//@PathVariable后面需要指定nameEn,不然可能报错}

第三步:在启动类中添加注解@EnableFeignClients(basePackages = {"com.xing.movie"})指定上面接口所在的类,可以只到父包

第四步:在MovieController中调用上面写的接口

@Autowired
private UserInterface userInterface;
@ApiOperation(value = "查询用户", notes = "查询用户By英文名")//方法说明
@ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Movie.class)})//响应数据说明,可以有多个
@ApiImplicitParam(name = "nameEn", value = "用户英文名", paramType = "path", required = true, dataType = "String")
@GetMapping(value = "/findUserByNameEn/{nameEn}",produces = { "application/json;charset=UTF-8" })
public User findUserByNameEn(@PathVariable String nameEn) {User user = userInterface.findByNameEn(nameEn);System.out.println("findUserByNameEn----"+user);return user;}        

之后直接访问测试,ok!

源码地址:https://github.com/OnlyXingxing/SpringCloud

  

转载于:https://www.cnblogs.com/xing-12/p/9910282.html

Feign实现服务调用相关推荐

  1. 定时器(@Scheduled)使用feign夸服务调用,Oauth2 客户端client_credentials模式

    定时器(@Scheduled)使用feign夸服务调用,Oauth2 客户端client_credentials模式 应用场景 定时器(@Scheduled)使用feign夸服务调用(A-->B ...

  2. Spring Cloud —— Feign 实现服务调用

    引言 本篇博客简单介绍 Feign 的基础知识和基本应用,以前一篇博客<Spring Cloud Alibaba--Nacos实现服务治理>为代码基础,实现更简单的微服务调用方式. 一.什 ...

  3. feign调用多个服务_SpringCloud使用Feign实现服务调用|chu

    Spring Cloud Feign简介 Spring Cloud Feign也是一个基础工具类,它整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两 ...

  4. 文件上传结合SpringCloud的Feign进行服务调用

    工作中一直使用的是SpringCloud,其中的多个组件的使用也已经有一段时间了,包括对组件的配置文件的编写,今天要讲的是SpringCloud中的一个远程服务调用的组件,使用Feign之后,我们调用 ...

  5. SpringCloud中Feign进行服务调用 java.io.IOException: too many bytes written 问题解决

    问题描述 Spring Cloud 中通过 Feign 调用微服务时,报错:java.io.IOException: too many bytes written 问题来源 在 Feign 调用拦截器 ...

  6. [Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用

    上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...

  7. feign响应拦截_[Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用

    上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...

  8. 微服务feignclient_[Spring cloud 一步步实现广告系统] 11. 使用Feign实现微服务调用

    上一节我们使用了Ribbon(基于Http/Tcp)进行微服务的调用,Ribbon的调用比较简单,通过Ribbon组件对请求的服务进行拦截,通过Eureka Server 获取到服务实例的IP:Por ...

  9. Spring Cloud之(十一)服务调用Feign

    十一.服务调用Feign 11.1 Feign简介 Feign是Netflix开发的声明式,模板化的HTTP客户端,其灵感来自Retrofit,JAXRS-2.0以及WebSocket. Feign可 ...

最新文章

  1. mac android 真机调试
  2. 热烈祝贺Polymer中文组织站点上线
  3. Ubuntu 中安装 Oracle 10g
  4. Linux学习:静态库和动态库
  5. 基于easyui开发Web版Activiti流程定制器详解(一)——目录结构
  6. HAProxy反向代理搭建discuz论坛
  7. Vue3动态组件、缓存组件、分发组件
  8. java中html的树状_HTML中的树状选择
  9. vue饼图组件_vue写一个图表组件(1)----饼图
  10. ubuntu 16.04 重装失败:进入grub出不来
  11. 转载 java序列化与反序列化
  12. sql事务Transaction
  13. NWT失败反省:一下子买1万个用户许可,全浪费了
  14. Hibernate方法save、update、merge、saveOrUpdate及get和load的区别
  15. asus z99s xp驱动
  16. 京瓷1020手动双面打印提示_自动双面打印时纸张是如何被翻转的?
  17. 面试必备(背)-Linux八股文系列!
  18. 计算机桌面倒计时,Mamsds桌面倒计时
  19. 前端开发可视化编辑神器mxDev又更新了
  20. 用防火墙可以防御DDoS吗?

热门文章

  1. iOS-ARC_Xcode检测循环引用
  2. Spring源代码解析(十):Spring Acegi框架授权的实现
  3. 未处理的异常导致基于 ASP.NET 的应用程序意外退出
  4. php解析ip列表并入库
  5. Java组合实体模式
  6. 阿里云弹性公网IP(EIP)的使用限制
  7. 国贫县山西永和:“一揽子”保险“保”脱贫
  8. Koa2和Redux中间件源码研究
  9. 比特币SPV节点启动流程图
  10. zabbix专题:第十一章 zabbix之SNMP方式监控