微服务一般来说当然是多服务多实例的,那么这些服务之间如何相互调用呢?spring cloud之前我们用dubbo,把服务开放出来,在xml配好后就可以像调用本地service一样调用其它模块的服务了;spring cloud当然也可以做到这一点,这就是feign。dubbo除了能调用其它模块服务,还实现了服务的负载均衡,对于spring cloud而言,这就是ribbon。
  我们看一下一个简单的调用示例:
--------------------------------------------------------------------------------------------------------------------------------

  1、服务提供者搭建
  作为一个示例项目,仅需引入最基本的web跟eureka依赖即可。
  xml主要内容:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

  application.yml内容:

spring:
application:
name: sms-module
info:
name: author:wzy,class:develop,tel:17301394307 server:
port: 9001 eureka:
client:
registerWithEureka: true
fetchRegistry: true
serverUrl:
defaultZone: http://127.0.0.1:8761/eureka
instance:
#心跳间隔
leaseRenewalIntervalInSeconds: 10
  conttoller类内容:
@RequestMapping("/sms")
@RestController
public class SmsController {
@Autowired
MessageService msgService; @RequestMapping("/getPerson")
public PersonVo getPerson(String phoneNumber){
PersonVo person = new PersonVo();
person.setName("张三");
person.setAge(20);
person.setSex('男');
person.setNativePlace("山东菏泽");
person.setIdentityCardId("37132519900809244x");
person.setPhoneNumber("13100001111"); System.out.println("sms收到的phoneNumber : "+phoneNumber);
return person;
}
}
  当然,启动类我们不能忘了@EnableEurekaClient,启动三个示例,端口分别为9001、9002、9003
  2、消费者搭建
  pom文件主要依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
  其实本示例中的内容较为简单,ribbon的starter可以不引入,本例使用的ribbon内容在spring-cloud-netflix-core包中。
  application.yml内容:

spring:
application:
name: feign-demo
info:
name: cloud feign-demo
server:
port: 8080 eureka:
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/ feign:
hystrix:
enable: false  
  先说feign部分的内容:
  feign是netflix的一个子项目,能实现基于http的rest api的访问。当然这个功能用apache的httpclient也可以实现,但用起来不方便,而feign使用起来非常友好。spring cloud feign是spring cloud把原生feign封装之后产生的。访问远程的微服务接口,我们希望能像访问本地service一样容易的进行访问,这样,对于每一个微服务我们都需要一个“工具类”client,比如:

//暂无熔断,因此无fallback回调
@FeignClient(name = "sms-module") //name对应的是服务名称
public interface FeignSmsClient { //注意,这里是接口
@RequestMapping(value = "/sms/getPerson") //类似于controller中的路径映射,但这不是controller,而是请求的发起端
PersonVo queryPerson(@RequestParam("phoneNumber") String phoneNumber); //普通的参数,如果是uri中的参数,应该用@PathParam,post请求还有@Body模板
}
  这个地方,如果有多个微服务需要我们访问,那就需要多个feignClient接口类,每个对应的服务名称不同而已,controller使用的时候直接注解引入即可。

  controller中使用:

@RequestMapping("/demo")
@RestController
public class TestClientController {
@Autowired
FeignSmsClient feignClient; @RequestMapping("/test2")
public PersonVo myGetPerson2(){
PersonVo personVo = null;
personVo = feignClient.queryPerson("15611273879");
return personVo;
}
}
  启动类加@EnableFeignClients,启动后访问:

  可以看到能正确返回结果,多次访问,可以看到sms-module的三个实例均有响应,表明cloud的feign默认已经实现了某种策略的负载均衡机制(默认是轮询)。
  有默认的负载机制当然好,但如果我们不想使用默认的负载机制,该怎么配置呢?有两种配置方法:1、yml配置文件 2、java类配置。
  yml配置文件,就是每个微服务单独配置,内容大致如下:

sms-module:    #服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #负载策略配置
  个人觉得,当服务比较多的时候,会占用比较多的内容,看起来有点乱,建议用java类配置或者单独作为一个配置文件跟配置中心搭配使用。  
  java配置类内容如下:

public class MyBalance {
@Bean
public IRule ribbonRule(){
System.out.println("------------------ribbon Rule -------------");
return new RandomRule();
}
}
  当然,只是这么写是没用的,还要让spring 容器读到这个内容,不同服务可能使用的负载策略也不一样:

@RibbonClients(value = {
@RibbonClient(name="sms-module",configuration = MyBalance.class),
@RibbonClient(name="consumer-module",configuration = MyBalance2.class)
})
  以上是feign跟ribbon搭配使用的情况,如果项目不适用feign单独使用ribbon的话该怎么用呢?
  ribbon是做负载策略的,那跟其它服务进行交互的任务由谁完成呢?RestTemplate闪亮登场。RestTemplate跟jdbcTemplate,jmsTemplate一样,是spring设计的为执行复杂任务而提供的一个具有默认行为的简单方法。RestTemplate是用来消费rest服务的,所以RestTemplate的主要方法都与rest的http协议的一些方法紧密相连,例如head、get、post、put、delete跟options等,这些协议在RestTemplate中对应的方法为headForHeaders()、getForObject()、postForObject、put()跟delete()等。
  restTemplate可以直接注解引入使用,但要先加@LoadBalanced修饰后才会跟负载机制关联。
  负载均衡器的核心是LoadBalancerClient,它可以获取负载均衡的服务提供者的实例信息,使用如下:

@RequestMapping("/demo")
@RestController
public class TestClientController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancerClient loadBalancerClient; @RequestMapping("/test")
public PersonVo myGetPerson(){
ServiceInstance instance = loadBalancerClient.choose("sms-module");
System.out.println("本次执行的实例是:"+instance.getHost()+":"+instance.getPort()); PersonVo personVo = null;
personVo = restTemplate.getForObject("http://sms-module/sms/getPerson?phoneNumber=17301394307",PersonVo.class); //注意这里http://后跟的是服务名,而不是实例的ip+port
return personVo;
} @Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
  访问结果如下:

  注意:restTemplate请求的时候,后边跟的是服务名而不是ip+端口号。
--------------------------------------------------------------------------------------------------------------------------------
先这样吧,更深的内容以后再补。

 

服务间调用--feign跟ribbon的更多相关文章

  1. spring cloud服务间调用feign

    参考文章:Spring Cloud Feign设计原理 1.feign是spring cloud服务间相互调用的组件,声明式.模板化的HTTP客户端.类似的HttpURLConnection.Apac ...

  2. SpringCloud初体验:三、Feign 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)

    FeignOpenFeign Feign是一种声明式.模板化的HTTP客户端. 看了解释过后,可以理解为他是一种 客户端 配置实现的策略,它实现 服务间调用(FeignClient).负载均衡(Rib ...

  3. ②SpringCloud 实战:引入Feign组件,完善服务间调用

    这是SpringCloud实战系列中第二篇文章,了解前面第一篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 简介 Feign 是一个声明式的 RE ...

  4. 小D课堂 - 新版本微服务springcloud+Docker教程_4-01 常用的服务间调用方式讲解

    笔记 第四章 服务消费者ribbon和feign实战和注册中心高可用 1.常用的服务间调用方式讲解     简介:讲解常用的服务间的调用方式 RPC:             远程过程调用,像调用本地 ...

  5. 小D课堂 - 新版本微服务springcloud+Docker教程_4-04 高级篇幅之服务间调用之负载均衡策略调整实战

    笔记 4.高级篇幅之服务间调用之负载均衡策略调整实战     简介:实战调整默认负载均衡策略实战 自定义负载均衡策略:http://cloud.spring.io/spring-cloud-stati ...

  6. SpringCloud微服务服务间调用之OpenFeign介绍

    开发微服务,免不了需要服务间调用.Spring Cloud框架提供了RestTemplate和FeignClient两个方式完成服务间调用,本文简要介绍如何使用OpenFeign完成服务间调用. Op ...

  7. Asp.Net Core使用SignalR进行服务间调用

    网上查询过很多关于ASP.NET core使用SignalR的简单例子,但是大部分都是简易聊天功能,今天心血来潮就搞了个使用SignalR进行服务间调用的简单DEMO. 至于SignalR是什么我就不 ...

  8. SpringCloud实现服务间调用(RestTemplate方式)

    上一篇文章<SpringCloud搭建注册中心与服务注册>介绍了注册中心的搭建和服务的注册,本文将介绍下服务消费者调用服务提供者的过程. 本文目录 一.服务调用流程二.服务提供者三.服务消 ...

  9. 基于gin的golang web开发:服务间调用

    微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...

随机推荐

  1. C/C++使用心得:enum与int的相互转换

    如何正确理解enum类型? 例如: enum Color { red, white, blue}; Color x; 我们应说x是Color类型的,而不应将x理解成enumeration类型,更不应将 ...

  2. (转)深入研究 蒋金楠(Artech)老师的 MiniMvc(迷你 MVC),看看 MVC 内部到底是如何运行的

    前言 跟我一起顺藤摸瓜剖析 Artech 老师的 MiniMVC 是如何运行的,了解它,我们就大体了解 ASP.NET MVC 是如何运行的了.既然是“顺藤摸瓜”,那我们就按照 ASP.NET 的执行 ...

  3. Blockade(Bzoj1123)

    Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n&l ...

  4. NOIp2018提高&普及游记

    (这篇文章是去年写的) day0 今天上了两节课后就出发了,大概是一点左右到达了宾馆,感觉宾馆条件是相当好的,然后两点出发,两点二十左右到达了考场,看到一群julao已经守候在了大门口,比如GZYju ...

  5. 拖放(Drag和Drop)--html5

    拖放,就是抓取一个对象后拖放到另一个位置.很常用的一个功能,在还没有html5的时候,我们实现这个功能,通常会用大量的js代码,再利用mousemove,mouseup等鼠标事件来实现,总的来说比较麻 ...

  6. oracle数据结构

    数据类型: 1 字符数据:CHAR VARCHAR NCHAR NVARCHAR2 LONG CLOB NCLOB  2 数字数据类型:NUMBER 唯一用来存储数字型的类型 3 日期数据类型: 4 ...

  7. Leetcode 70. Climbing Stairs 爬楼梯 (递归,记忆化,动态规划)

    题目描述 要爬N阶楼梯,每次你可以走一阶或者两阶,问到N阶有多少种走法 测试样例 Input: 2 Output: 2 Explanation: 到第二阶有2种走法 1. 1 步 + 1 步 2. 2 ...

  8. kuangbin专题十六 KMP&&扩展KMP HDU2609 How many (最小字符串表示法)

    Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How man ...

  9. Nginx01---简单使用

    基于腾讯云--ubuntu系统 1.安装nginx sudo apt-get install nginx 2.启动,停止nginx nginx -c /usr/local/nginx/conf/ngi ...

  10. zookeeper客户端使用第三方(Curator)封装的Api操作节点

    1.为什么使用Curator? Curator本身是Netflix公司开源的zookeeper客户端: Curator  提供了各种应用场景的实现封装: curator-framework  提供了f ...