SpringCloud只Feign如何实现负载均衡:

简介

Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

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

作用

Feign旨在使编写Java Http客户端变得更容易。
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。

Feign集成了Ribbon

利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

步骤

新建microservicecloud-consumer-dept-feign

我们可以直接复制microservicecloud-consumer-dept-80这个项目,然后进行相应的修改

  1. 修改主启动类名字为DeptConsumer80_Feign_App

pom.xm

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>microservicecloud</artifactId>        <groupId>com.hph.springcloud</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>

    <artifactId>microservicecloud-consumer-dept-feig</artifactId>

    <dependencies>        <dependency><!-- 自己定义的api -->            <groupId>com.hph.springcloud</groupId>            <artifactId>microservicecloud-api</artifactId>            <version>${project.version}</version>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-feign</artifactId>        </dependency>        <!-- Ribbon相关 -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-ribbon</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-config</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- 修改后立即生效,热部署 -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>springloaded</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>        </dependency>    </dependencies></project>

DeptConsumer80_Feign_App

123456789101112131415161718
package com.hph.springcloud;

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.netflix.feign.EnableFeignClients;

@SpringBootApplication@EnableEurekaClient//在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效@EnableFeignClients(basePackages= {"com.hph.springcloud"})public class DeptConsumer80_Feign_App{    public static void main(String[] args)    {        SpringApplication.run(DeptConsumer80_Feign_App.class, args);    }}

修改microservicecloud-api工程

1234567891011121314151617181920212223242526
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>microservicecloud</artifactId>        <groupId>com.hph.springcloud</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>

    <artifactId>microservicecloud-api</artifactId><dependencies>    <dependency>        <groupId>org.projectlombok</groupId>        <artifactId>lombok</artifactId>    </dependency>

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

</dependencies>

</project>

pom.xml

1234567891011121314151617181920212223242526
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <parent>        <artifactId>microservicecloud</artifactId>        <groupId>com.hph.springcloud</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>

    <artifactId>microservicecloud-api</artifactId><dependencies>    <dependency>        <groupId>org.projectlombok</groupId>        <artifactId>lombok</artifactId>    </dependency>

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

</dependencies>

</project>

DeptClientService

12345678910111213141516171819202122
package com.hph.springcloud.service;

import com.hph.springcloud.entities.Dept;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 java.util.List;

@FeignClient(value = "MICROSERVICECLOUD-DEPT") //指定微服务public interface DeptClientService {    @RequestMapping(value = "/dept/get/{id}",method = RequestMethod.GET)    public Dept get(@PathVariable("id") long id);

    @RequestMapping(value = "/dept/list",method = RequestMethod.GET)    public List<Dept> list();

    @RequestMapping(value = "/dept/add",method = RequestMethod.POST)    public boolean add(Dept dept);

}

然后执行mvn clean mvn install更新本地中的依赖包为我们修改过的依赖包。

修改microservicecloud-consumer-dept-feign

Controller

添加上一步新建的DeptClientService接口

123456789101112131415161718192021222324252627282930313233343536
package com.hph.springcloud.controller;

import com.hph.springcloud.entities.Dept;import com.hph.springcloud.service.DeptClientService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController

public class DeptController_Consumer {    @Autowired    private DeptClientService service = null;

    @RequestMapping(value = "/consumer/dept/get/{id}")    public Dept get(@PathVariable("id") Long id)    {        return this.service.get(id);    }

    @RequestMapping(value = "/consumer/dept/list")    public List<Dept> list()    {        return this.service.list();    }

    @RequestMapping(value = "/consumer/dept/add")    public Object add(Dept dept)    {        return this.service.add(dept);    }

}

修改主启动类

123456789101112131415161718
package com.hph.springcloud;

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.EnableEurekaClient;import org.springframework.cloud.netflix.feign.EnableFeignClients;

@SpringBootApplication@EnableEurekaClient//在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效@EnableFeignClients(basePackages= {"com.hph.springcloud"})public class DeptConsumer80_Feign_App{    public static void main(String[] args)    {        SpringApplication.run(DeptConsumer80_Feign_App.class, args);    }}

测试

  1. 首先一次启动E启动3个eureka集群

  2. 启动部门微服务8001/8002/8003

  3. 启动microservicecloud-consumer-dept-feig

  4. 访问http://localhost/consumer/dept/get/1

小结

Feign通过接口的方法调用Rest服务(之前是Ribbon+RestTemplate),该请求发送给Eureka服务器http://localhost/consumer/dept/get/1,通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。

代码

Github代码地址: https://github.com/bigdataxiaohan/microservicecloud/tree/master/Feign

SpringCloud与Feign相关推荐

  1. springcloud 实战 feign使用中遇到的相关问题

    springcloud 实战 feign使用中遇到的相关问题 1.使用feign客户端调用其他微服务时,session没有传递成功,sessionId不一样. /*** @author xbchenf ...

  2. SpringBoot+SpringCloud —— 使用Feign消费服务

    转自:https://www.cnblogs.com/yimixiong/p/7927991.html 转:SpringBoot+SpringCloud -- 使用Feign消费服务 Feign简介 ...

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

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

  4. SpringCloud 中 Feign 核心原理,简单易懂!

    目录 SpringCloud 中 Feign 核心原理 Feign远程调用的基本流程 Feign 远程调用的重要组件 Feigh 远程调用的执行流程 SpringCloud 中 Feign 核心原理 ...

  5. SpringCloud 中 Feign 调用添加 Oauth2 Authorization Header

    SpringCloud 中 Feign 调用添加 Oauth2 Authorization Header SpringCloud 中通过 Feign 调用其他服务,当服务使用 Oauth2 授权的时候 ...

  6. SpringCloud 中Feign原理(图解)

    1 SpringCloud 中Feign原理 1.1 Feign简介 Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端.Spring Clou ...

  7. springcloud 消费者 Feign (类似 webservice)

    ---------------------------------------------------------------------------------------------------- ...

  8. springcloud feign 服务调用其他服务_微服务实战——SpringCloud与Feign集成

    上一篇集成了ZuulGateway和Eureka并进行了测试.在实际场景中,我们肯定会有很多的微服务,而他们之间可能会存在相互调用的关系,那么,如何优雅的处理服务之间的调用问题呢?接下来就是我们要解决 ...

  9. springcloud使用feign进行远程服务调用

    声明式服务调用SpringCloud Feign Feign客户端是一个web声明式http远程调用工具,提供了接口和注解方式进行调用,和ribbon都属于springcloud生态内客户端调用组件, ...

最新文章

  1. sqllite配置(参考别人)
  2. 《Java语言导学(原书第6版)》一一1.5 问题和练习:快速入门
  3. 2013 javaB3 振兴中华、从我做起
  4. python json库安装_python怎么安装requests库
  5. tensorflow 卷积:设定特定卷积核
  6. Q102:光线追踪场景(5)——驭龙台
  7. C语言中指针数组和数组指针
  8. paip.图形化编程厉器.net vs2010 工作流WF4 hello word
  9. 【微信hook】微信机器人之PC微信hook
  10. 极大似然函数求解_快速理解极大似然法
  11. Python3制作网易云音乐下载器!付费的你猜能下载吗!
  12. pc电脑微信多开的方法,无需安装任何工具2022
  13. 手机网页图片自适应大小 background-size css 图片全屏 背景尺寸设置
  14. Visionpro Display 添加框线
  15. 自定义字体文件解析成人眼可识别文字
  16. 弘辽科技:淘宝直通车智能推广报告如何解?
  17. js event属性
  18. [A*,启发式搜索] [SCOI2005] 骑士精神
  19. 【单元复习】之标日初级下册第九、十单元
  20. ssm实现敏感词过滤

热门文章

  1. dfa转正则表达式_GitHub - hidva/re2dot: 根据正则表达式生成其对应 DFA 的状态转移图...
  2. 栈溢出脚本_漏洞练习之网络编程与堆栈溢出技术
  3. WPF中退出时显示是否保存数据提示
  4. MapReduce基础
  5. go语言基础之导入包的常用方法
  6. ubuntu14.04 remmina远程连接rdp服务器失败解决办法
  7. 常用加密算法的Java实现(一)
  8. NGUI使用教程(2) 使用NGUI创建2D场景而且加入标签和button
  9. 每日一测5(关于继承)
  10. 关于日历的一个超级存储过程