微服务学习SpringCloud之Feign实现负载均衡
写在前面:后续的文章都是基于第一篇文章进行更新,我是按照SpringCloud学习顺序进行文章编写,因为项目只有一个项目,需要了解SpringCloud前面skill的可以看一下前面SpringCloud体系。
上面一篇文章中介绍到使用Ribbon实现了负载均衡策略。SpringCloud实现负载均衡的方式还有一种通过Fegin的方式。
具体实现如下:
新建一个Fegin模块,这个模块和之前的消费端模块一样,在这个模块之上进行更改
在之前的common模块增加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
同时这个模块也需要增加对Fegin支持的依赖,和上面一样
在common模块添加Fegin接口支持
package com.gysoft.bean.fegin;
import com.gysoft.bean.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;
/**
* @Description
* @Author DJZ-WWS
* @Date 2019/5/9 16:04
*/
@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);
}
在fegin消费模块增加新的Controller
package com.gysoft.controller;
/**
* @Description
* @Author DJZ-WWS
* @Date 2019/5/9 16:09
*/
import java.util.List;
import com.gysoft.bean.Dept;
import com.gysoft.bean.fegin.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;
@RestController
public class DeptController_Feign
{
@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);
}
}
在启动类上增加 注解@EnableFeignClients,启用Fegin功能。
先编译一下common 命令 mvn clean insatll
测试
启动Eureka集群。启动三个服务,启动fegin消费者
访问地址:
结果:
[{"deptno":1,"dname":"开发部","db_source":"clouddb02"},
{"deptno":2,"dname":"人事部","db_source":"clouddb02"},
{"deptno":3,"dname":"财务部","db_source":"clouddb02"},
{"deptno":4,"dname":"市场部","db_source":"clouddb02"},
{"deptno":5,"dname":"运维部","db_source":"clouddb02"}]
多访问几次,发现每次返回的数据库都不一样,和Ribbon实现了同样效果。
就这样实现了Fegin的负载均衡,和Ribbon不一样的是它通过接口的方式,Ribbon通过和Eureka整合去Eureka里面发现服务地址,自身在做一次选择。
