SpringCloud-Feign服务相互调用(傻瓜式操作实例)

示例:A服务调用B服务

AB服务中添加feign+redis+session依赖

//feign依赖
<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
//redis-session依赖
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
        <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
</dependency>    

 

 

1.A服务

Application启动类中添加

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.FlushMode;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;

@SpringBootApplication
@EnableEurekaClient
//增加redissession缓存支持
@EnableRedisHttpSession(flushMode = FlushMode.IMMEDIATE)
@MapperScan({"com.**.dao"})
//增加feign支持,引入feign注解,feign扫描路径可以单独指定(basePackages = ),默认是spring的扫描路径
@EnableFeignClients(basePackages = "com.**.feign")
public class SyhCloudXxkglApplication extends SpringBootServletInitializer implements RequestInterceptor {

    public static void main(String[] args) {
        SpringApplication.run(SyhCloudXxkglApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(SyhCloudXxkglApplication.class);
    }

    /*使用Feign调用某个远程API,这个远程API需要传递一个鉴权信息,我们可以把cookie里面的session信息放到Header里面,这个Header是动态的,跟你的HttpRequest相关,我们选择编写一个拦截器来实现Header的传递,也就是需要实现RequestInterceptor接口*/
    @Override
    public void apply(RequestTemplate template) {

        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (requestAttributes == null) {
            return;
        }

        HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                String name = headerNames.nextElement();
                Enumeration<String> values = request.getHeaders(name);
                while (values.hasMoreElements()) {
                    String value = values.nextElement();
                    template.header(name, value);
                }
            }
        }

    }
}

创建一个包,存放调用其他服务的接口文件

package com.**.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @Title:
 * @ProjectName
 * @Description: TODO
 * @author: TongSiYu
 * @date 2021-8-9 14:55
 */
/*指定需要调用的B服务名称*/
@FeignClient("syh-cloud-system")
public interface Rose {
    /*需要访问的完整路径*/
    @RequestMapping("/role/queryAllForRole")
    public Object getRose();
}

调用接口

package com.**.controller;

import com.**.feign.Rose;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * @Title:
 * @ProjectName
 * @Description: TODO
 * @author: TongSiYu
 * @date 2021-8-9 14:53
 */
@RestController
@RequestMapping("/feign")
public class FeignController {
    /*注入B服务的接口文件*/
    @Autowired
    private Rose rose;

    @RequestMapping("/getrose")
    public Object getProductInfoList(HttpServletRequest request)     {
        System.out.println("1");
        Object object = rose.getRose();
        return object;
    }
}

 

posted @ 2021-08-10 17:08  铜丝儿  阅读(691)  评论(0编辑  收藏  举报