前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Feign(负载均衡)

Feign(负载均衡)

作者头像
爱撒谎的男孩
发布2019-12-31 15:50:12
9530
发布2019-12-31 15:50:12
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

1. Feign 负载均衡

1.1. 简介

1.2. 使用

1.3. 注意

1.4. 负载均衡算法

Feign 负载均衡

简介

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

使用

  • 添加依赖(消费者端和公共模块端)
代码语言:javascript
复制
   <!--feign的依赖-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!--eureka客户端的依赖-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<!--ribbon的依赖-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • 创建两个服务提供者,实例名称为DEPT-PROVIDER
代码语言:javascript
复制
@RestController
public class DeptController {
	/**
	 * 根据Id获取部门
	 * @param id
	 * @return
	 */
	@GetMapping("/dept/{id}")
	public Dept getDept(@PathVariable("id") Integer id) {
		Dept dept=new Dept();
		dept.setDeptId(id);
		dept.setDeptName("8081");
		return dept;
	}
	
	/**
	 * 添加部门
	 * @param dept
	 */
	@PostMapping("/dept")
	public Dept addDept(@RequestBody Dept dept) {
		return dept;
	}
}
  • 一般我们需要将feign接口写在公共的项目中,因为接口不止一个项目使用,可以提供给多个项目使用,在dept-api这个项目中添加如下的feign接口,其中@FeignClient这个注解的value属性必须和对应的服务提供者的实例名称相同
代码语言:javascript
复制
package cn.tedu.api.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import cn.tedu.api.doamin.Dept;

/**
 * 1、配置一个Feign的客户端,使用@FeignClient(),其中的name是微服务提供者的实例名称
 * 2、其中的restful风格的api只能使用RequestMapping,不能使用GetMapping等,有些版本可能会报错
 * 3、怎样和提供者的api对应呢?
 * 		1、并不是方法名称一致,根据uri来区分的,只要uri访问一致,那么就会匹配对应的服务提供者的api
 * 		2、虽然不是根据方法名称来匹配,但是我们最好保持一致
 */
@FeignClient("DEPT-PROVIDER")
public interface DeptFeign {
	
	/**
	 * 获取部门,使用Get方式请求
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/dept/{id}",method=RequestMethod.GET)
	Dept get(@PathVariable("id")Integer id);
	
	/**
	 * 添加部门,使用POST请求的方式
	 * @param dept
	 * @return
	 */
	@RequestMapping(value="/dept",method=RequestMethod.POST)
	Dept addDept(Dept dept);
}
  • 创建消费者,添加上面的dept-api这个坐标,直接注入DeptFeign这个接口实例即可使用,如下:
代码语言:javascript
复制
@RestController
public class DeptController {
	@Resource
	private DeptFeign deptFeign;  //直接注入Feign接口,不过需要在主启动类上扫描该类所在的包或者父包
	
	/**
	 * 根据部门Id获取部门
	 * @param id
	 * @return
	 */
	@GetMapping("/dept/{id}")
	public Dept getDept(@PathVariable("id") Integer id) {
		return deptFeign.get(id);
	}
	
	/**
	 * 添加部门,json方式提交
	 * @param dept
	 * @return
	 */
	@PostMapping("/dept")
	public Dept addDept(@RequestBody Dept dept) {
		return deptFeign.addDept(dept);
	}
}
  • 在消费者的主启动类上添加@EnableFeignClients这个注解,注意一定要扫描带有@FeignClient这个注解的接口的包或者父包,将其注入到ioc容器中
代码语言:javascript
复制
@SpringBootApplication
@EnableEurekaClient    //eureka客户端
@EnableFeignClients(basePackages= {"cn.tedu.api"})   //开启Feign,其中basePackages扫描的包一定要是@FeignClient这个注解的所在包或者父包
public class DeptConsumer8003Application {
	public static void main(String[] args) {
		SpringApplication.run(DeptConsumer8003Application.class, args);
	}
}

注意

  • 消费者端的主启动类上需要使用@EnableFeignClients并且扫描带有@FeignClient这个注解的包或者父包
  • Feign是和Eureka结合使用的,因此需要添加Eureka的依赖,并且在主启动类上添加对应的注解@EnableEurekaClient
  • Feign的接口怎样和提供者的api对应呢?
    • 并不是方法名称一致,根据uri来区分的,只要uri访问一致,那么就会匹配对应的服务提供者的api
    • 虽然不是根据方法名称来匹配,但是我们最好保持一致
  • 其中的restful风格的api只能使用RequestMapping,不能使用GetMapping等,有些版本可能会报错
  • 一般使用Feign定义接口都需要放在公共模块中,因为这些接口可能是公用的

负载均衡算法

  • Feign是结合Ribbon使用的,负载均衡算法和Ribbon是一样的,默认采用的是轮询算法,如果需要改变,只需要注入Ribbon的已经有的算法即可,具体操作和Ribbon一样,只需要新建一个配置类类,直接注入接,如下:
代码语言:javascript
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

/**
 * Feign的负载均衡算法的配置类,和Ribbon一样
 */
@Configuration
public class FeignRule {
	
	/**
	 * 注入随机算法
	 * @return
	 */
	@Bean
	public IRule myRule() {
		return new RandomRule();   //直接创建一个随机算法返回即可
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Feign 负载均衡
    • 简介
      • 使用
        • 注意
          • 负载均衡算法
          相关产品与服务
          负载均衡
          负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档