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")