SpringCloud-Feign服务相互调用(傻瓜式操作实例)
示例:A服务调用B服务
AB服务中添加feign+redis+session依赖
//feign依赖//redis-session依赖 org.springframework.cloud spring-cloud-starter-openfeign org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis
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(); EnumerationheaderNames = request.getHeaderNames(); if (headerNames != null) { while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); Enumeration 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; } }