zoukankan      html  css  js  c++  java
  • SpringCloud Alibaba Nacos 服务发现 Feign进行消费

    使用Feign服务发现消费服务
    1. 启动Nacos访问地址为:http://101.200.201.195:8848/nacos/
    2. 启动buscien-service-01业务服务,进行消费

    准备工作完成后进行服务消费。

    第一步:创建一个Maven工程buscien-service-03

    第二步:编辑pom.xml,加入必要的依赖配置

    <!-- 导入bom依赖管理工程 -->
    <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>com.opensource</groupId>
                    <artifactId>bom</artifactId>
                    <version>1.0.0</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    <!-- 业务服务所需依赖 -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
        </dependencies>
    

    在bom工程中已经全部定义好了对应的版本所以我们在业务工程中就不需要定义依赖版本了,统一在bom中进行维护。

    第三步:创建一个SpringBoot启动类,并且增加一个Http服务

    /**
     * SpringCloud Alibaba 服务发现 Feign进行消费服务
     *
     * @author WuWenTao
     * @version 1.0
     * @date 2020/9/2 14:18
     */
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class BuscienService03Appl {
    
        public static void main(String[] args) {
            SpringApplication.run(BuscienService03Appl.class, args);
        }
    }
    
    @FeignClient("buscien-service-01-app")
    interface BuscienDemo1Feign {
    
        @GetMapping("/buscien1/sayHello")
        public String sayHello(@RequestParam(name = "name") String name);
    }
    
    @RestController
    @RequestMapping("/buscien3/")
    class FeignConsumerController {
    
        @Autowired
        private BuscienDemo1Feign buscienDemo1Feign;
    
        @GetMapping("/consumer")
        public String consumer(@RequestParam String name) {
            return buscienDemo1Feign.sayHello(name);
        }
    
    }
    

    以上内容非常清晰。启动类上增加@EnableFeignClients用于告诉框架扫描所有通过注解@FeignClient定义的feign客户端。BuscienDemo1Feign接口中使用@FeignClient声明代表他是一个Feign客户端,并且引用的是buscien-service-01-app服务。FeignConsumerController中注入Feign调用即可。

    第四步:编写application.properties

    server.port=2000
    spring.application.name=buscien-service-03-app
    spring.cloud.nacos.discovery.server-addr=101.200.201.195:8848
    

    第五步:启动BuscienService03Appl,启动完成,在Nacos界面中能够看到注册上去的服务,访问BuscienService03Appl中的服务接口:

    http://localhost:3000/buscien3/consumer?name=ServiceConsumer

    请求成功后返回:

    hello ServiceConsumer
    
    Feign传递请求头

    在做接口请求时,我们经常会在header头中增加一些鉴权信息,如token 或 jwt,那么在通过fegin从A server去调用B server的接口时,如果B server的接口需要header信息,我们需要将A sever获取的header转发到B上。可以通过实现Feign提供的拦截器来实现,创建FeignRequestInterceptor类进行传递请求头。

    /**
     * Feign传递请求头
     *
     * @author WuWenTao
     * @version 1.0
     * @date 2020/9/2 17:12
     */
    @Component
    public class FeignRequestInterceptor implements RequestInterceptor {
    
        private Logger log = LoggerFactory.getLogger(FeignRequestInterceptor.class);
    
        @Override
        public void apply(RequestTemplate template) {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                    .getRequestAttributes();
            //获取请求头
            HttpServletRequest request = attributes.getRequest();
            Enumeration<String> headerNames = request.getHeaderNames();
            if (headerNames != null) {
                while (headerNames.hasMoreElements()) {
                    String name = headerNames.nextElement();
                    String values = request.getHeader(name);
                    //将请求头保存到模板中
                    template.header(name, values);
    
                }
                //如需传递各位如token
                // template.header("token", token);
                log.info("feign interceptor header:{}", template);
            }
        }
    }
    

    以上内容非常清晰,获取当前请求正文请求头存入Feign请求模板中。

    源码地址:https://github.com/450255266/spring-cloud-alibaba

    Nacos地址对外开放:http://101.200.201.195:8848/nacos/

  • 相关阅读:
    Quartz.NET-2.3.3 各种 数据库配置 类别大全
    C#获取当前路径的七种方法 【转载】
    BCB 如何拦截TAB键消息
    用union 和 struct 位域操作
    表值函数
    C#中 委托和事件的关系
    关于C++ Builder Codegurad 问题的排查。
    存储过程中使用事务的“正规”写法
    C++ 中对vector<T*> 数组的查找和排序
    BCB 中 Application->CreateForm 和 New 的一个区别
  • 原文地址:https://www.cnblogs.com/SimpleWu/p/13602833.html
Copyright © 2011-2022 走看看