SpringCloud-Feign服務相互呼叫(傻瓜式操作例項)
阿新 • • 發佈:2021-08-10
示例: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; } }