maven项目下feign公共模块
- 导包
<?xml version="1.0" encoding="UTF-8"?>
sc-login
org.login
0.0.1-SNAPSHOT
4.0.0
org.login
login-common
0.0.1-SNAPSHOT
org.springframework.cloud
spring-cloud-openfeign-core
org.springframework.boot
spring-boot-maven-plugin
none
execute
repackage
- 目录
login-common 主要存放 feign 接口,提给给其他微服务调用
login-server 主要是存放业务代码
- 实现
feign 接口
package com.zl.common.api;
import com.zl.common.api.fallback.RoleClientFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Primary;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.zl.server.domain.user.model.entity.User;
/**
* @author z
*/
@Primary
@FeignClient(name = "login", primary = false, qualifier = "loginClient", fallback = LoginClientFallback.class)
public interface LoginClient {
/**
* 获取用户信息
*
* @param userId 用户id
* @return 用户信息
*/
@GetMapping("/user/getUserInfo")
User getUserInfo(@RequestParam String userId);
}
@FeignClient 中的 name,value 属性值为application.properties的 spring.application.name=login 的值
feign接口熔断
package com.zl.common.api.fallback;
import com.zl.common.api.LoginClient;
import org.springframework.stereotype.Component;
import com.zl.server.domain.user.model.entity.User;
/**
* LoginClient fallback
*
* @author z
* @date 2022-04-02 11:30
*/
@Component
public class LoginClientFallback implements LoginClient {
@Override
public User getUserInfo(String userId) {
return null;
}
}
在熔断上面加 @Component 注解,才能使 LoginClientFallback 生效
feign接口实现
package com.zl.server.domain.user.web.api;
import com.zl.common.api.LoginClient;
import com.zl.server.domain.user.service.ISysUserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import com.zl.server.domain.user.model.entity.User;
import javax.annotation.Resource;
/**
* 用户 api
*
* @author z
* @date 2022-04-02 11:37
*/
@RestController
@ApiIgnore
public class LoginClientController implements LoginClient {
/**
* 用户 service
*/
@Resource
private ISysUserService iSysUserService;
/**
* 获取用户信息
*
* @param userId 用户id
* @return 用户信息
*/
@GetMapping("/user/getUserInfo")
@Override
public User getUserInfo(@RequestParam String userId) {
User list = iSysUserService.getUserInfo(userId);
return User;
}
}
feign接口的controller实现feign接口便于管理,与前端交互的controller分开
在启动类LoginApplication中加入@EnableFeignClients(basePackages = {"com.zl.**.api"})注解使feign接口生效
最后,将这个公共的feign模块包引入到其他的模块中就可以调用了
问题:
- application.properties 配置了 server.servlet.context-path为/user,导致feign接口调用失败
解决:
在 @FeignClient 注解里使用 path 属性指定请求前缀,@FeignClient(name = "login", path="user")