Spring-Cloud(二)—— 声明式REST客户端Feign

在微服务架构中,feign是比较好用的一种服务提供接口的调用方式,它使编写Web服务客户端更加容易;并且在使用Feign的同时,它还集成了Ribbon用以完成接口调用的负载均衡。

简单实现:

服务提供端:

接下来就是具体实现一个Feign接口了,我个人比较倾向于如下实现方式

可以看下项目骨架。

接口都是写在user-server-api中。而具体实现是放在user-server-provider

/**
 *
 * @author DKing/Chenxiaorui
 * @description
 * @date 2020/3/27
 *
 */
@RequestMapping("/user-server-api")
public interface UserServerApi {
}

个人觉得这样写是比较好的,其他服务想调用user-system服务的接口,只需要加user-server-api的依赖,并且实现UserServerApi接口即可,使用这样一种黑盒调用,更方便接口的管理。而且,消费端不需要关注我接口内部实现的变化,只需要按规划升级依赖即可,而且接口的调用是没有什么开发量的。这里可以看下消费端的具体使用。

消费端:

在消费端,需要定义FeignClient,所以首先是要在springboot启动类中增加注解@EnableFeignClients,启动类在启动时,会扫描FeignClient注解的类实现自动装配,如果不加这一注解,系统是无法识别的。只会导致接口无法使用。404就来了。

@SpringBootApplication
@EnableFeignClients
public class BlogWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(BlogWebApplication.class, args);
    }

}

然后呢,就是加入所需要服务的api依赖。

		<dependency>
			<groupId>com.king.dk</groupId>
			<artifactId>user-server-api</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>

然后根据java的继承特性,继承服务提供端提供的api类

/**
 *
 * @author DKing/Chenxiaorui
 * @description
 * @date 2020/4/1
 *
 */
@FeignClient(value = "${user-system.server.appname}")
public interface UserSystemApi extends UserServerApi {
}

这样一来,我们可以在消费端使用UserSystemApi类new的对象来调用UserServerApi的restful接口,从而调到服务提供端的具体实现。

可以看到,消费端,我们并没有做任何代码的开发,也没有类似接口的冗余声明,只需要管理好依赖的版本和服务提供端的应用名称,就可以完成对UserSystem服务交互。em,很解耦,很内聚。

Ps.以上代码都是空实现,随手写的小Demo,但是有自己对Feign接口使用的一些小心得。不喜勿喷。哈哈欢迎交流,探讨

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章