文档章节

Spring Cloud学习:02服务消费者(Ribbon&Feign)

寒武没有纪
 寒武没有纪
发布于 2017/10/21 21:37
字数 1317
阅读 108
收藏 3

在微服务架构中,业务会拆分成一个独立的服务,服务与服务之间基于http restful进行通信。Spring Cloud有两种服务调用方式,一种是Ribbon+restTemplate,另一种是Feign。

1 Ribbon+restTemplate

1.1 Ribbon介绍

Spring Cloud Ribbon是基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon实现。通过Spring Cloud封装,可以方便地将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。包括下面的Feign调用,也是基于Ribbon实现的。

基于Spring Cloud Ribbon的封装,使用客户端负载均衡调用服务非常简单,只需实现两步:
       ①服务提供者只需启动多个服务实例并注册到一个注册中心或多个相关联的服务注册中心。
       ②服务消费者直接通过调用被@LoadBalanced注解(开启客户端负载均衡)的RestTemplate实现面向服务的接口调用。

1.2 测试Ribbon+restTemplate方式调用

1.2.1创建服务提供方(Eureka Client)

基于之前工程,创建新模块ribbon-service,选择Spring Initializr->Cloud Discovery->Eureka Discovery,并添加以下依赖:

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

1.2.2 添加服务提供方配置文件

server:
    port: 8764

eureka:
    client:
      serviceUrl:
        defaultZone: http://localhost:8761/eureka/

spring:
    application:
      name: ribbon-service #指明应用名称(服务与服务相互调用根据name属性)

1.2.3 启动类中添加初始化RestTemplate,用于发起REST请求,使用@LoadBalanced注解开启负载均衡。

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonServiceApplication {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(RibbonServiceApplication.class, args);
    }
}

1.2.4 创建一个接口消费Eureka Client提供的接口:

@RestController
public class DemoController {

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/one")
    public String one(){
        return restTemplate.getForObject("http://ONE-SERVICE/one",String.class);
    }
    
}

1.2.5 启动工程

        ①启动服务注册中心eureka-server工程;

        ②启动one-service工程,当前端口为8762,修改端口为8763,再次启动一个实例(如使用IDEA,在Edit Configurations中指定应用中去除勾选Single instance only,否则请求时会出现以下错误),启动完成后,one-service拥有2个服务实例;

       ③启动ribbon-service工程,端口为8764。

1.2.6 浏览器多次访问http://localhost:8764/one,交替出现以下内容,说明负载均衡访问不同端口的服务实例。

one-service test port:8762

one-service test port:8763

2 Feign

2.1 Feign介绍

Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的编码器和解码器。Spring Cloud Feign还扩展了对Spring MVC注解的支持,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。

分布式应用早在十几年前就开始出现,各自的应用运行在各自的tomcat,jboss一类的容器中,他们之间的相互调用变成了一种远程调用,而实现远程调用的方式很多。按照协议划分,可以有RPC,Webservice,http。不同的框架也对他们有了各自的实现,如dubbo(x),motan就都是RPC框架,本文所要讲解的Feign便可以理解为一种http框架,用于分布式服务之间通过Http进行接口交互。说他是框架,有点过了,可以理解为一个http工具,只不过在spring cloud全家桶的体系中,它比httpclient,okhttp,retrofit这些http工具都要强大的多。

2.2 测试Feign方式调用

2.2.1 创建Feign方式的服务提供方

基于先前工程创建新模块feign-service,选择Spring Initializr->Cloud Discovery->Eureka Discovery,并添加以下依赖:

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

2.2.2 添加服务提供方配置信息

server:
    port: 8765

eureka:
    client:
      serviceUrl:
        defaultZone: http://localhost:8761/eureka/

spring:
    application:
      name: feign-service #指明应用名称(服务与服务相互调用根据name属性)

2.2.3 启动类添加@EnableFeignClients注解开启Feign功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignServiceApplication {

   public static void main(String[] args) {
      SpringApplication.run(FeignServiceApplication.class, args);
   }
}

2.2.4 定义一个Feign接口,使用@FeignClient ("服务名称")调用指定服务,调用one-service服务的”/one”接口:

@FeignClient("one-service")
public interface FeignDemoService {

    @RequestMapping(value = "/one", method = RequestMethod.GET)
    String invocateOneService();
}

2.2.5 添加测试接口

@RestController
public class FeignDemoController {

    @Autowired
    FeignDemoService feignDemoService;

    @RequestMapping("/one")
    public String one() {
        return feignDemoService.invocateOneService();
    }
}

2.2.6 启动工程

        ①启动服务注册中心eureka-server工程;

        ②启动one-service 2个服务实例,端口分别为8762和 8763;

        ③启动feign-service工程,端口为8765。

2.2.7 浏览器多次访问http://localhost:8765/one,交替出现以下内容:

one-service test port:8762

one-service test port:8763

本文源码下载地址:

https://github.com/laravelshao/spring-cloud-learning/tree/master/setion02-ribbon-feign

3 参考资料

Spring RestTemplate as a Load Balancer Client

How to Include Feign

方志朋->史上最简单的SpringCloud教程

翟永超->Spring Cloud基础教程 & Spring Cloud微服务实战

© 著作权归作者所有

共有 人打赏支持
寒武没有纪
粉丝 10
博文 31
码字总数 32748
作品 0
杨浦
程序员
私信 提问
Spring Cloud 入门教程4、服务容错保护:断路器(Hystrix)

一、前言 1、为什么需要断路器 在分布式架构中,一个应用依赖多个服务是非常常见的,如果其中一个依赖由于延迟过高发生阻塞,调用该依赖服务的线程就会阻塞,如果相关业务的QPS较高,就可能产...

吴伟祥
02/18
0
0
热门技术从零开始学Spring Cloud视频教程发布

使用技术 (1)spring boot,使用版本:1.5.8 (2)spring cloud ,使用版本:Dalston.SR4 (3)Netflix Eureka (4)Netflix Ribbon (5)Feign (6)Netflix Hystrix (7)Spring Clou Con...

小红牛
2018/08/04
0
0
spring cloud 入门系列:总结

从我第一次接触Spring Cloud到现在已经有3个多月了,当时是在博客园里面注册了账号,并且看到很多文章都在谈论微服务,因此我就去了解了下,最终决定开始学习Spring Cloud。我在一款阅读App...

JAVA开发老菜鸟
2018/07/20
0
0
Spring Cloud学习(3)——服务发现与消费以及客户端负载均衡Ribbon

版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/huqigang,内容如有错误,欢迎留言指出,谢谢! https://blog.csdn.net/huqigang/article/details/7...

胡了了
2018/03/01
0
0
Spring Cloud 入门教程2、服务消费者(Ribbon)

一、前言 1、什么是Ribbon Ribbon是Netflix开源的实现了负载均衡等功能的RPC客户端。 支持HTTP、TCP、UDP协议,且有一定的容错、缓存等机制。 Spring Cloud基于Ribbon封装了Spring Cloud Ri...

吴伟祥
02/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

极路由4刷OpenWrt(LEDE)

申请开发者模式 登录路由器后台 进入插件中间 选中路由器信息 申请开发者权限 安装开发者插件 刷 Bootloader 下载 极路由4 的 Breed 通过SSH登录路由器 (必须安装开发者插件,端口 1022 账号...

dingdayu
33分钟前
3
0
浅淡个人学习嵌入式Linux过程

我专业是电子信息工程,在初入大学的时候,我们的班主任便要我们多多去了解一些关于电子方面的知识。后来我了解到了嵌入式,继而了解到了嵌入式Linux。其实我们学习linux差不多就学习linux内...

linux-tao
今天
7
0
SpringBoot使用GraphQL简单学习-1

官网 一、GraphQL简介 1.GraphQL是什么? GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够...

wind2012
今天
5
0
Android的WIFI局域网对讲机

https://blog.csdn.net/z979451341/article/details/79280749 (三)Android局域网内语音对讲 基于UDP语音传输 https://blog.csdn.net/stormxiaofeng/article/details/80513947 Android7.0手......

shzwork
今天
2
0
vuex

一直有个误区 vuex既然页面刷新会丢失 那还有什么意义 。 重新翻看了下文档才恍然大误,vuex主要解决的是不同组件间的通信。 跨页面数据共享本质上还是用sessionStorage/localStorage...

东东笔记
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部