1. 程式人生 > 其它 >SpringCloud-Feign服務相互呼叫(傻瓜式操作例項)

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;
    }
}