Feign--SpringCloud和SpringBoot之四负载均衡

学习尚硅谷老师的springcloud,摘抄和总结以及分类笔记!
只要学不死,就往死里学!
承接自上一个SpringCloud和SpringBoot整合Ribbon。
链接:官网对feign的解释

什么是Feign?

Declarative REST Client: Feign

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Ribbon and Eureka to provide a load balanced http client when using Feign.
译文:
Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,
只需要创建一个接口,然后在上面添加注解即可。
参考官网:https://github.com/OpenFeign/feign

Feign能干什么?

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

Feign是怎么来的?

1.大家都接受,直接使用微服务来访问

        //	private static final String REST_URL_PREFIX="http://localhost:8001";
           	/*
           	 * spring: application: name: microservicecloud-dept 对外暴露的微服务名字,8001provider类的yml配置
           	 */
           	private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";

2.目前大家都习惯面向接口编程,比如webService接口,比如DAO接口,这个是大家的规范
2.1.微服务名字获得调用地址
2.2.通过接口+注解,获得调用的微服务
(适应社区其他程序员提出的,还是统一的面向接口编程的套路。此乃Feign)
如:

   @Mapper
   public interface Dao{
   
   }

Ribbon功能很强大,甚至可以自定义算法。

一、新建Feign工程

pom文件修改:
参照Consumer工程新建Feign工程
复制Consumer工程pom文件依赖,并添加新依赖

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

application.yml:
复制consumer工程的application.yml文件

    server:
      port: 80
    eureka:
     client:
       register-with-eureka: false   #不向注册中心注册自己
       service-url: 
         defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

主启动类、配置类、controller类全部复制:

DeptController_Consumer :修改前:

    @RestController//依然加上restcontroller注解
    
    public class DeptController_Consumer {
    //	private static final String REST_URL_PREFIX="http://localhost:8001";//直接访问的8001端口没有通过euraka-server
    	/*
    	 * spring: application: name: microservicecloud-dept 对外暴露的微服务名字,8001provider类的yml配置
    	 */
    	private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";
    	@Autowired
    	private RestTemplate restTemplate;//rest模板
    	//	RestTemplate提供了多种便捷访问远程Http服务的方法, 
    	//	是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
    	
    	@RequestMapping(value = "consumer/dept/add") //注意这里的consumer没有加上,/consumer
    	public boolean add(Dept dept) {//在配置文件里面配好了,可以直接用
    		return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, boolean.class);
    	}
    	
    	@RequestMapping(value = "consumer/dept/get/{id}")
    	public Dept get(@PathVariable long id) {//在配置文件里面配好了,可以直接用
    		return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
    	}
    	@SuppressWarnings("unchecked")
    	@RequestMapping(value = "consumer/dept/list")
    	public List<Dept> list() {//在配置文件里面配好了,可以直接用
    		return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
    	}
    	
    	//测试@EnableDiscoveryClient,消费端可以调用服务发现
    	@RequestMapping(value="/consumer/dept/discovery") 
    	public Object discovery()
    	  {
    	return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery", Object.class);
    	  }
    }

DeptController_Consumer 修改后:

扫描二维码关注公众号,回复: 9748301 查看本文章
    @RestController // 依然加上restcontroller注解
    
    public class DeptController_Consumer {
    	@Autowired
    	private DeptClientService service;
    
    	@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 list() {
    		return this.service.list();
    	}
    
    	@RequestMapping(value = "/consumer/dept/add")
    	public Object add(Dept dept) {
    		return this.service.add(dept);
    	}
    }

主启动类修改前:

    @SpringBootApplication
    @EnableEurekaClient //client端
    @RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration = MySelfRule.class)
    //表示对MICROSERVICECLOUD-DEPT这个微服务,使用自定义的MySelfRule负载均衡算法。
    public class DeptConsumer80_App {
    
    	public static void main(String[] args) {
    		SpringApplication.run(DeptConsumer80_App.class, args);
    	}
    
    }

主启动类修改后:

    @SpringBootApplication
    @EnableEurekaClient //client端
    @EnableFeignClients(basePackages= {"com.atguigu.springcloud"})
    @ComponentScan("com.atguigu.springcloud")
    //表示对MICROSERVICECLOUD-DEPT这个微服务,使用自定义的MySelfRule负载均衡算法。
    public class DeptConsumer80_Feign_App {
    
    	public static void main(String[] args) {
    		SpringApplication.run(DeptConsumer80_Feign_App.class, args);
    	}
    
    }

配置类不用修改:

二、修改自定义api工程

pom文件加入以下新依赖:

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

新建service接口并加上注解@FeignClient:
@FeignClient(value = “MICROSERVICECLOUD-DEPT”)

    @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 list();
    	@RequestMapping(value = "/dept/add",method = RequestMethod.POST)
    	public boolean add(Dept dept);
    }

三、测试

启动3个eureka集群–server
启动3个微服务–provider
启动Feign工程
测试以下链接

    http://localhost/consumer/dept/list

注意:Feign自带负载均衡配置项:轮换算法

发布了18 篇原创文章 · 获赞 11 · 访问量 1212

猜你喜欢

转载自blog.csdn.net/konmor/article/details/101158611