微服务间接口调用 feign

目录

    • Feign说明
    • 引入依赖,启动类开启客户端
    • 开启Feign client
    • Feign接口开发
    • 编写容错实现类
    • 在业务层调用Feign客户端接口
    • 编写服务端提供接口
    • Feign的常用属性如下

Feign说明

Feign是一种声明式、模板化的HTTP客户端。在spring cloud中使用Feign,可以做到类似于普通的接口的请求调用,可以发现对应的服务的接口,进而直接调用对应服务中的接口。

引入依赖,启动类开启客户端

首先需要引入依赖

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-openfeignartifactId>
dependency>

开启Feign client

然后在启动类中加入注解@EnableFeignClients ,开启Feign客户端。

@EnableFeignClients(basePackages = {"com.mz.**.client"}, defaultConfiguration = {FeignConfiguration.class})//可以注明Feign 需要扫描的包 即client所在包
public class SSOApplication {
	public static void main(String[] args) {
        SpringApplication.run(SSOApplication.class, args);
    }
}

Feign接口开发

然后在当前服务内编写Feign接口,接口与普通的controller层类似,只是在类上不需要写@Controller等注解,只需要加上@Component 、 @FeignClient注解即可,下面的请求方法需要写上请求方式(根据提供服务的接口适配)@PostMapping(“/findOne”)注解。如下:

@Component
@FeignClient(value = "sso", path = "/api/user", fallback = UserClientHystrix.class)//value是需要调用的微服务名称,path是sso服务中对应接口的请求路径,fallback 是做的容错实现类,做服务调用失败后返回的结果。
public interface UserClient {

    /**
     * 获取对象集合
     * @param object
     * @return
     */
    @PostMapping("/findOne")//根据服务适配添加注解
    Result<UserDO> findByUsesrNo(@CustomJSONBody Object object);
}

编写容错实现类

容错类主要是在调用对应的服务接口时如果出现异常时的应急措施,返回一个自定义结果。

@Component("userClientHystrix")
public class UserClientHystrix implements UserClient {

    @Override
    public Result<UserDO> findByUsesrNo(Object object) {
        return Result.error("服务不可用!");
    }
}

在业务层调用Feign客户端接口

编写好Feign客户端接口后,就可以在本服务内的业务层调用Feign的接口实现服务间的调用了。

@Resource
UserClient userClient;

public Result<UserDO> findByUsesrNo(){
	Map<String, String> map = new HashMap<>();
	map.put("userNo", "1001");
	return Result.success(userClient.findByUserNo(map).getData());
}

编写服务端提供接口

服务提供接口,可被Fegin发现调用,及本服务内的接口使用。服务端提供的接口就是一个普通的controller。对应的服务名称根据上面的UserClient中可以知道是sso。然后上面的调用路径需要与此处配置的路径保持一致;包括传参等需要与对应的服务端做适配处理。

@RestController
@RequestMapping("/api/user")
public class UserController{

	@Autowired
	UserService service;

	@RequestMapping("/findOne")
	public Result<UserDO> findByUsesrNo(@CustomJSONBody Object object){
		Map<String, String> map = (Map) object;
		String userNo = map.get("userNo");
		return service.findByUserNo(userNo );
	}
}

Feign的常用属性如下

name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
url: url一般用于调试,可以手动指定@FeignClient调用的地址,如果指定了url地址后,会优先调用url指定的地址
decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
path: 定义当前FeignClient的统一前缀,当我们项目中配置了server.context-path,server.servlet-path时使用

你可能感兴趣的:(Java,微服务,java)