zoukankan      html  css  js  c++  java
  • 31.【微服务架构】SpringCloud之Feign(五)

    Feign简介

      Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign.

    Feignm—个声明式的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只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。

     

    pom修改

    feign可能被很多项目都用,所以pom放在api公共项目的pom.xml文件中。

    <!-- 旧版本 ,本文档以旧版本例子讲解-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>
    
    <!-- 新版本 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

    新增Service到microservicecloud-api项目中,以便这个方法对外暴露可以被各个微服务项目直接引用

    package com.everjiankang.springcloud.service;
    
    import java.util.List;
    
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import com.everjiankang.springcloud.entity.Dept;
    
    @FeignClient(value="MICROSERVICECLOUD-DEPT") //微服务名称
    public interface DeptService {
        
        @RequestMapping(value = "/consumer/dept/add",method=RequestMethod.POST)
        public boolean add(Dept dept);
    
        @RequestMapping(value = "/consumer/dept/get/{id}",method=RequestMethod.GET)
        public Dept get(Long id);
    
        @RequestMapping(value = "/consumer/dept/list",method=RequestMethod.GET)
        public List<Dept> list();
    }

    在microservicecloud-consumer-dept-feign项目的启动类上加注解:

    @SpringBootApplication
    @ComponentScan(basePackages = {"com.everjiankang.springcloud"})
    @MapperScan(basePackages = {"com.thc.adt.*.dao"})
    @EnableFeignClients(basePackages = {"ccom.everjiankang.springcloud"})
    @EnableAspectJAutoProxy
    @EnableScheduling
    public class AdtApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(AdtApplication.class, args);
        }
    }
    Feign 通过接口的方法调用Rest服务(之前是 Ribbon + RestTemPlate )
    该请求发送给 Eureka 服务器(http://MICROSERVICECLOUD一DEPT/dept/list)
    通过 Feign 直接找到服务接口,由于在进行服务调用的时候融合了 Ribbon 技术所以也支持负载均衡作用.





    Feign请求拦截器:
    @Component
    @Configuration
    public class FeignInterceptor implements RequestInterceptor {
    
        @Bean
        public Logger.Level feignLogger(){
            return Logger.Level.FULL;
        }
    
    //    PermissionFeign permissionFeign;
    
        @Override
        public void apply(RequestTemplate requestTemplate) {
            requestTemplate.header("Accept", "application/json");
            requestTemplate.header("Accpet-Encoding", "gzip");
            requestTemplate.header("Content-Encoding", "UTF-8");
            requestTemplate.header("Content-Type", "application/json; charset=UTF-8");
    
            if (!StringUtils.isEmpty(SessionUtil.getToken())){
                requestTemplate.header("x-access-token",SessionUtil.getToken());
            }
        }
    }
    
    
    




  • 相关阅读:
    Oracle递归查询,Oracle START WITH……CONNECT BY查询
    jquery Ajax请求示例,jquery Ajax基本请求方法示例
    Jquery EasyUI Combotree和 EasyUI tree展开所有父节点和获取完整路径
    Jquery EasyUI Combotree根据选中的值展开所有父节点
    Jquery EasyUI Combotree 初始化赋值
    Jquery EasyUI Combotree只能选择叶子节点且叶子节点有多选框
    SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)
    SpringBoot Druid整合,SpringBoot 集成Druid
    安卓TTS语音合成经验分享(科大讯飞语音+)集成
    delphi7的新生,参与分布式应用开发,调用RESTful API,Json的应用
  • 原文地址:https://www.cnblogs.com/guchunchao/p/10431383.html
Copyright © 2011-2022 走看看