前言
maven依赖
<!-- feign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
项目结构
First of all, I will introduce the code structure of my side.
sds-core-server-user-api
api: there are entity classes and feign's api interfacesds-core-server-user
Server: Mainly the regular service, and the other is the api implementation classsds-website-server-base
Consumer end: call the server
Both the server side and the consumer side refer to the api, the following code example focuses on these three pieces.
代码示例
-
sds-core-server-user-api
feign api interface (the code below basically includes most of the parameter passing types)
import com.core.server.entity.BasePrivilege; import com.core.server.entity.BaseRole; import com.core.server.entity.BaseUser; import com.core.server.entity.dto.BasePrivilegeDto; import com.core.server.entity.dto.BaseRoleDto; import com.core.server.entity.dto.BaseUserDto; import com.core.server.entity.dto.search.BasePrivilegeSearchDto; import com.core.server.entity.dto.search.BaseRoleSearchDto; import com.core.server.entity.dto.search.BaseUserSearchDto; import com.core.server.entity.dto.security.SecurityRoleDto; import com.core.server.entity.dto.security.SecurityUserDto; import com.core.server.entity.dto.system.PrivilegeTree; import com.core.server.system.feign.FeignConfiguration; import com.github.pagehelper.PageInfo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** * @author :qilong sun * @date :Created in 2019/11/23 18:40 * @description:用户服务api接口 * @modified By: * @version: 1.0$ */ @FeignClient(value = "sds-basic-server-gateway", fallback = BaseUserFeignFallBack.class, configuration = FeignConfiguration.class) public interface BaseUserFeignServiceApi { String serverName = "/sds-core-server-user"; /** * 删除用户 * @param userId * @param deleteUserId * @return */ @PostMapping(value = serverName+"/deleteBaseUser", produces = "application/json; charset=UTF-8") Boolean deleteBaseUser(@RequestParam("userId")Integer userId, @RequestParam("deleteUserId")Integer deleteUserId); /** * 保存用户 * @param userId * @param baseUserDto * @return */ @PostMapping(value = serverName+"/saveBaseUser", produces = "application/json; charset=UTF-8") Boolean saveBaseUser(@RequestParam("userId")Integer userId, @RequestBody BaseUserDto baseUserDto); /** * 查询所有的资源树 * @return */ @PostMapping(value = serverName+"/queryAllPrivilegeTree", produces = "application/json; charset=UTF-8") List<PrivilegeTree> queryAllPrivilegeTree(); /** * 删除角色 * @param userId * @param roleId * @return */ @PostMapping(value = serverName+"/deleteBaseRole", produces = "application/json; charset=UTF-8") Boolean deleteBaseRole(@RequestParam("userId")Integer userId, @RequestParam("roleId")Integer roleId); /** * 保存角色信息(添加,修改) * @param userId * @param baseRoleDto * @return */ @PostMapping(value = serverName+"/saveBaseRole", produces = "application/json; charset=UTF-8") Boolean saveBaseRole(@RequestParam("userId")Integer userId, @RequestBody BaseRoleDto baseRoleDto); /** * 根据角色ID查询角色详情 * @param roleId * @return */ @PostMapping(value = serverName+"/queryBaseRoleDto", produces = "application/json; charset=UTF-8") BaseRoleDto queryBaseRoleDto(@RequestParam("roleId")Integer roleId); /** * 查询角色分页列表 * @param baseRoleSearchDto * @return */ @PostMapping(value = serverName+"/queryBaseRolePageList", produces = "application/json; charset=UTF-8") PageInfo<BaseRole> queryBaseRolePageList(@RequestBody BaseRoleSearchDto baseRoleSearchDto); /** * 查询用户角色分页列表 * @param baseUserSearchDto * @return */ @PostMapping(value = serverName+"/selectBaseUserAndRolePageList", produces = "application/json; charset=UTF-8") PageInfo<BaseUserDto> selectBaseUserAndRolePageList(@RequestBody BaseUserSearchDto baseUserSearchDto); /** * 查询资源分页列表 * @param basePrivilegeSearchDto * @return */ @PostMapping(value = serverName+"/queryBasePrivilegePageList", produces = "application/json; charset=UTF-8") PageInfo<BasePrivilegeDto> queryBasePrivilegePageList(@RequestBody BasePrivilegeSearchDto basePrivilegeSearchDto); /** * 根据用户查询侧边栏菜单 * @param userId * @return */ @PostMapping(value = serverName+"/queryAsideMenuByUserId", produces = "application/json; charset=UTF-8") List<PrivilegeTree> queryAsideMenuByUserId(@RequestParam("userId")Integer userId); /** * 查询用户分页列表 * @param baseUserSearchDto * @return */ @PostMapping(value = serverName+"/queryUserInfoPageList", produces = "application/json; charset=UTF-8") PageInfo<BaseUserDto> queryUserInfoPageList(@RequestBody BaseUserSearchDto baseUserSearchDto); /** * 根据用户ID查询资源列表 * @param userId * @return */ @PostMapping(value = serverName+"/queryBasePrivilegeByUserId", produces = "application/json; charset=UTF-8") List<BasePrivilege> queryBasePrivilegeByUserId(@RequestParam("userId") Integer userId); /** * 根据账号查询用户信息 * @param username * @return */ @PostMapping(value = serverName+"/queryBaseUserByUsername", produces = "application/json; charset=UTF-8") BaseUser queryBaseUserByUsername(@RequestParam("username") String username); /** * 查询单个用户 * @param baseUser * @return */ @PostMapping(value = serverName+"/queryBaseUser", produces = "application/json; charset=UTF-8") BaseUser queryBaseUser(@RequestBody BaseUser baseUser); /** * 查询单个用户详情 * @param baseUserDto * @return */ @PostMapping(value = serverName+"/queryBaseUserDetail", produces = "application/json; charset=UTF-8") BaseUserDto queryBaseUserDetail(@RequestBody BaseUserDto baseUserDto); /** * 根据角色编码,查询角色信息 * @param codeName * @return */ @PostMapping(value = serverName+"/querySecurityRoleDtoByCodeName", produces = "application/json; charset=UTF-8") SecurityRoleDto querySecurityRoleDtoByCodeName(@RequestParam("codeName") String codeName); /** * 根据登录账号查询用户信息(基本信息,角色信息) * @param username * @return */ @PostMapping(value = serverName+"/querySecurityUserDtoByOne", produces = "application/json; charset=UTF-8") SecurityUserDto querySecurityUserDtoByOne(@RequestParam("username") String username); }
fallback (to avoid too long, only part of it is shown here)
import com.core.server.entity.dto.BasePrivilegeDto; import com.core.server.entity.dto.BaseRoleDto; import com.core.server.entity.dto.BaseUserDto; import com.core.server.entity.dto.search.BasePrivilegeSearchDto; import com.core.server.entity.dto.search.BaseRoleSearchDto; import com.core.server.entity.dto.search.BaseUserSearchDto; import com.core.server.entity.dto.security.SecurityRoleDto; import com.core.server.entity.dto.security.SecurityUserDto; import com.core.server.entity.dto.system.PrivilegeTree; import com.core.server.entity.BasePrivilege; import com.core.server.entity.BaseRole; import com.core.server.entity.BaseUser; import com.github.pagehelper.PageInfo; import org.springframework.stereotype.Component; import java.util.List; /** * @author :qilong sun * @date :Created in 2020/1/4 16:48 * @description: * @modified By: * @version: $1.0 */ @Component public class BaseUserFeignFallBack implements BaseUserFeignServiceApi{ @Override public Boolean deleteBaseUser(Integer userId, Integer deleteUserId) { return null; } @Override public Boolean saveBaseUser(Integer userId, BaseUserDto baseUserDto) { return null; } @Override public List<PrivilegeTree> queryAllPrivilegeTree() { return null; } }
FeignConfiguration
import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.Configuration; /** * @author :qilong sun * @date :Created in 2020/6/17 15:38 * @description:Feign调用的时添加请求头from https://blog.csdn.net/Hpsyche/article/details/102926010 * @modified By: * @version: V1.0$ */ @Configuration public class FeignConfiguration implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { // 此处是我在集成gateway时添加的测试代码,只是使用feign的话可以把这行注释掉 requestTemplate.header("from", "gateway"); } }
-
sds-core-server-user
Server
The server is mainly the api implementation classimport com.basic.util.service.impl.BaseServiceImpl; import com.core.server.entity.dto.BasePrivilegeDto; import com.core.server.entity.dto.BaseRoleDto; import com.core.server.entity.dto.BaseUserDto; import com.core.server.entity.dto.search.BasePrivilegeSearchDto; import com.core.server.entity.dto.search.BaseRoleSearchDto; import com.core.server.entity.dto.search.BaseUserSearchDto; import com.core.server.entity.dto.security.SecurityRoleDto; import com.core.server.entity.dto.security.SecurityUserDto; import com.core.server.entity.dto.system.PrivilegeTree; import com.core.server.entity.BasePrivilege; import com.core.server.entity.BaseRole; import com.core.server.entity.BaseUser; import com.core.server.service.BasePrivilegeService; import com.core.server.service.BaseRoleService; import com.core.server.service.BaseUserService; import com.core.server.service.api.user.BaseUserFeignServiceApi; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * @author :qilong sun * @date :Created in 2019/11/24 10:22 * @description:用户接口 * @modified By: * @version: 1.0$ */ @Service @RestController public class BaseUserFeignServiceApiImpl extends BaseServiceImpl<BaseUser> implements BaseUserFeignServiceApi { @Autowired BaseUserService baseUserService; @Autowired BaseRoleService baseRoleService; @Autowired BasePrivilegeService basePrivilegeService; @Override public Boolean deleteBaseUser(Integer userId, Integer deleteUserId) { return baseUserService.deleteBaseUser(userId, deleteUserId); } @Override public Boolean saveBaseUser(Integer userId, BaseUserDto baseUserDto) { return baseUserService.saveBaseUser(userId, baseUserDto); } @Override public List<PrivilegeTree> queryAllPrivilegeTree() { return baseRoleService.queryAllPrivilegeTree(); } @Override public Boolean deleteBaseRole(Integer userId, Integer roleId) { return baseRoleService.deleteBaseRole(userId, roleId); } @Override public Boolean saveBaseRole(Integer userId, BaseRoleDto baseRoleDto) { return baseRoleService.saveBaseRole(userId, baseRoleDto); } @Override public BaseRoleDto queryBaseRoleDto(Integer roleId) { return baseRoleService.queryBaseRoleDto(roleId); } @Override public PageInfo<BaseRole> queryBaseRolePageList(BaseRoleSearchDto baseRoleSearchDto) { return baseRoleService.queryBaseRolePageList(baseRoleSearchDto); } @Override public PageInfo<BaseUserDto> selectBaseUserAndRolePageList(BaseUserSearchDto baseUserSearchDto) { return baseUserService.selectBaseUserAndRolePageList(baseUserSearchDto); } @Override public PageInfo<BasePrivilegeDto> queryBasePrivilegePageList(BasePrivilegeSearchDto basePrivilegeSearchDto) { return basePrivilegeService.queryBasePrivilegePageList(basePrivilegeSearchDto); } @Override public List<PrivilegeTree> queryAsideMenuByUserId(Integer userId) { return baseUserService.queryAsideMenuByUserId(userId); } @Override public PageInfo<BaseUserDto> queryUserInfoPageList(BaseUserSearchDto baseUserSearchDto) { return baseUserService.queryUserInfoPageList(baseUserSearchDto); } @Override public List<BasePrivilege> queryBasePrivilegeByUserId(Integer userId) { return basePrivilegeService.queryBasePrivilegeByUserId(userId); } @Override public BaseUser queryBaseUserByUsername(String username) { return baseUserService.queryBaseUserByUsername(username); } @Override public BaseUser queryBaseUser(BaseUser baseUser) { return baseUserService.queryBaseUser(baseUser); } @Override public BaseUserDto queryBaseUserDetail(BaseUserDto baseUserDto) { return baseUserService.queryBaseUserDetail(baseUserDto); } @Override public SecurityRoleDto querySecurityRoleDtoByCodeName(String codeName) { return baseUserService.querySecurityRoleDtoByCodeName(codeName); } @Override public SecurityUserDto querySecurityUserDtoByOne(String username) { return baseUserService.querySecurityUserDtoByOne(username); } }
-
sds-website-server-base
First, add feign annotations to the startup class (search for different configurations)@EnableFeignClients(basePackages = { "com.core.server.*"},defaultConfiguration = FeignClientsConfiguration.class)
Secondly, in the business code directly through the interface in the api, just call
baseUserFeignServiceApi.queryAsideMenuByUserId(userId)
结语
If it is the get method, just change the annotation on the api interface directly.
Existing Problems:
- If the server has multiple api interfaces, there will be problems;
- Fallback can extract common code. So you don’t have to implement each method one by one
When these are used later, they will be processed.