前言
maven依赖
<!-- feign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
项目结构
首先,介绍我这边代码结构,省的后面你们看不懂。
sds-core-server-user-api
api:里面有实体类,以及feign的api接口sds-core-server-user
服务端:里面主要是常规的service,另外就是api实现类了sds-website-server-base
消费端:调用服务端
服务端和消费端都引用了api,下面代码示例里面着重介绍这三块。
代码示例
-
sds-core-server-user-api
feign api接口 (下面代码基本包括了大部分传参类型)
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 (避免篇幅过长,此处仅显示一部分)
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
服务端
服务端主要就是api实现类了import 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
首先,启动类添加feign注解(不同的配置自己另外搜一下)@EnableFeignClients(basePackages = { "com.core.server.*"},defaultConfiguration = FeignClientsConfiguration.class)
其次,在业务代码里面直接通过api里面的接口,调用就行了
baseUserFeignServiceApi.queryAsideMenuByUserId(userId)
结语
如果是get方法,那直接把api接口上的注解改一下就好了。
现存问题:
- 服务端如果有多个api接口会有问题;
- fallback可以抽取出公共代码。这样就不用每个方法都一一实现了
这些以后再用的时候,再处理。