SpringCloud Alibaba Nacos 服务发现 Feign进行消费

JAVA学习网 2020-09-03 16:53:01
使用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/

阅读(823) 评论(0)