什么是Feign

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。注意:负载均衡是加在客户端中,而不是服务端中。

简而言之:

Feign 采用的是基于接口的注解

Feign 整合了ribbon

代码实现及演示效果

注册中心(略)

1、在客户端添加依赖包

1
2
3
4
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

2、在客户端启动类中使用@EnableFeignClients开启feiginClient功能

1
2
3
4
5
6
7
8
@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
public class ServiceAApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceAApplication.class, args);
    }
}

3、在客户端中新建一个ServiceAFeignClient接口调用service-b的服务

1
2
3
4
5
6
7
8
9
10
11
package com.example.servicea;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Component
@FeignClient(value = "service-b"//这里的name对应调用服务的spring.applicatoin.name
public interface ServiceAFeignClient {
    @RequestMapping(value = "/hi")
    String hi(@RequestParam("id") String id);
}

4、在客户端系统中写一个测试controller

1
2
3
4
5
6
7
8
9
10
@RestController
public class TestController {
    @Autowired
    ServiceAFeignClient serviceAFeignClient;
     
    @RequestMapping("/hi")
    public String hi(@RequestParam String id){
        return serviceAFeignClient.hi(id);
    }
}

5、在服务端系统中提供一个hi()方法,供客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@EnableEurekaClient
@RestController
@SpringBootApplication
public class ServiceBApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceBApplication.class, args);
    }
    @Value("${spring.application.name}")
    private String name;
    @Value("${server.port}")
    private String port;
    @RequestMapping("/hi")
    public String hi(@RequestParam String id){
        return "hi, " + id + ", " + name + ":" + port;
    }
}

6、新建一个服务service-b-2,代码和service-b完全一致,只需改端口号(服务名也叫service-b,spring.application.name=service-b)

在eclipse中可以不新建工程,当启动了service-b后,改service-b的端口号,再启动一次,这样就启动了两个service-b服务,区别是端口号不同。

启动后会在Eureka注册中心中看到service-b有两个,一个端口号为8081,一个为8082:

DS Replicas

Instances currently registered with Eureka

Application AMIs Availability Zones Status
SERVICE-A n/a (1) (1) UP (1) - SZVY2AWX5511361.china.huawei.com:service-a:8083
SERVICE-B n/a (2) (2)

UP (2) - SZVY2AWX5511361.china.huawei.com:service-b:8081 ,

SZVY2AWX5511361.china.huawei.com:service-b:8082

7、查看效果

访问:http://localhost:8083/hi?id=123

返回:hi, 123, service-b:8082

刷新:hi, 123, service-b:8081

刷新:hi, 123, service-b:8082

刷新:hi, 123, service-b:8081

因为Ribbon负债均衡默认使用的是轮询机制。

springcloud使用使用Feign-Ribbon做负载均衡实现声明式REST调用的更多相关文章

  1. Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现

    介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...

  2. springcloud(十二):Ribbon客户端负载均衡介绍

    springcloud(十二):Ribbon客户端负载均衡介绍 Ribbon简介 使用分布式微服务脚骨的应用系统,在部署的时候通常会为部分或者全部微服务搭建集群环境,通过提供多个实例来提高系统的稳定型 ...

  3. ③SpringCloud 实战:使用 Ribbon 客户端负载均衡

    这是SpringCloud实战系列中第三篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

  4. SpringCloud之声明式服务调用 Feign(三)

    一 Feign简介 Feign是一种声明式.模板化的HTTP客户端,也是netflix公司组件.使用feign可以在远程调用另外服务的API,如果调用本地API一样.我们知道,阿里巴巴的doubbo采 ...

  5. SpringCloud 源码系列(6)—— 声明式服务调用 Feign

    SpringCloud 源码系列(1)-- 注册中心 Eureka(上) SpringCloud 源码系列(2)-- 注册中心 Eureka(中) SpringCloud 源码系列(3)-- 注册中心 ...

  6. springcloud 之Ribbon客户端负载均衡配置使用

    pom.xml添加配置说明:这里服务注册与发现用的是Eureka,所以消费者端需要引入eureka,使用EurekaClient来调用服务 <dependency> <groupId ...

  7. 【一起学源码-微服务】Feign 源码三:Feign结合Ribbon实现负载均衡的原理分析

    前言 前情回顾 上一讲我们已经知道了Feign的工作原理其实是在项目启动的时候,通过JDK动态代理为每个FeignClinent生成一个动态代理. 动态代理的数据结构是:ReflectiveFeign ...

  8. SpringCloud微服务实战——搭建企业级开发框架(十二):OpenFeign+Ribbon实现负载均衡

      Ribbon是Netflix下的负载均衡项目,它主要实现中间层应用程序的负载均衡.为Ribbon配置服务提供者地址列表后,Ribbon就会基于某种负载均衡算法,自动帮助服务调用者去请求.Ribbo ...

  9. 使用ribbon实现负载均衡

    使用ribbon之前的准备工作: 1.你要有两个服务,一个是服务消费方(下图的xing-movie是消费方),一个是服务提供方(xing-user是服务提供者),并且服务提供方要有两个实例,也就是xi ...

随机推荐

  1. ElasticSearch 2 (4) - API Convention

    ElasticSearch 2.1.1 (4) - API Convention The elasticsearch REST APIs are exposed using JSON over HTT ...

  2. 在PHPStorm中快速插入当前日期

    在EditPlus中使用快捷键Ctrl+D即可插入当前日期,但在PHPStorm中似乎没有这样的快捷键,那如何实现快速插入当前日期呢?其实很简单,跟我做一遍你就会了: 目标 为PHPStorm定义一个 ...

  3. laravel 处理自定错误页面,如404,500,501,502,503,504等等

    laravel 5.0 版本下,修改pp/Exceptions/Handler.phppublic function render($request, Exception $e) { if ($e i ...

  4. Delphi DBGrid记录全选和反选拖动处理

    DBGrid1.DragMode   :=   dmManual;//留意这个设置不要变 procedure ApplicationEvents1Message(var Msg: tagMSG; va ...

  5. Java获取当前运行方法所在的类和方法名

    很简单,直接看代码: public void showClassAndMethod() { System.out.println(this.getClass().getSimpleName() + & ...

  6. [代码]--给GridControl中的某列添加图片

    要让GridControl的某列显示图片只需要数据源中有图片就可以正确显示 1.给DataSet添加一列,格式为image ds.Tables[].Columns.Add("SIGN&quo ...

  7. Maven父子项目配置-多模块(multi-modules)结构

    Maven创建父子项目,这个项目指的是eclipse中的project,idea中的module.使用idea创建的话很简单,可以直接选择项目的父亲,这些网上有很多资料的. 这里说一下创建父子项目时, ...

  8. Django_基于模块的单例模式

    基于模块的单例模式  原理: Python 的独有特性 : 模块的导入只能生效一次. 再重复导入只要基于一套环境都是使用的 最初 的那份资源.  示例: 文档结构: # mysingleton.py ...

  9. MT【184】$\epsilon$助力必要性

    已知满足不等式$|x^2-4x+a|+|x-3|\le5$的最大值为$3$,求实数$a$的值,并解该不等式. 证明:1)当$x=3$时,$|a-3|\le5$,得$a\in[-2,8]$2)$\for ...

  10. 【刷题】LOJ 6009 「网络流 24 题」软件补丁

    题目描述 某公司发现其研制的一个软件中有 \(n\) 个错误,随即为该软件发放了一批共 \(m\) 个补丁程序.每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些 ...