前提:创建好eureka-server,一套provider-consumer,注册到Eureka注册中心。
一、Feign实现声明式REST调用
1.Feign简介
HTTP客户端
声明式、模板化
支持Spring MVC注解
Feign是Netflix开发的声明式,模板化的HTTP客户端,其灵感来自Retrofit,JAXRS-2.0以及WebSocket.
- Feign可帮助我们更加便捷,优雅的调用HTTP API。
- 在SpringCloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完成了。
- Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
- SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
2.Feign实现微服务接口调用
准备
注册两个微服务:Provider和Consumer
实现Consumer对Provider的接口调用
2.1 Provider创建服务方法
在provider 中添加UserService类,提供login()方法
@RestController
public class Userservice {
@RequestMapping(value = "/login")
public String login(){
return "登录成功1";
}
}
2.2 Consumer进行调用准备
在consumer项目pom中添加Feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
2.3 consumer添加client、service、controller类
(因为使用的是feign组件,所以consumer不能直接调provieder,要通过client类来进行调用)
2.4 编写client类
client中的接口是和provider项目中Controller类的接口一样:就Url和参数列表一样就可以, 其他的可以不一样。
为接口添加@FeignClient注解并指定name属性值为provider项目的名称。
@FeignClient(name = "eureka-provider-demo",fallback = UserFallBack.class)
public interface UserClient {
@RequestMapping(value = "/login")
public String login();
}
2.5 consumer中创建的UserServicImpl类调用userClient。
consumer中的Controller类调用service。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserClient userClient;
@Override
public String login() {
return userClient.login();
}
}
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/login")
public String login(){
return userService.login();
}
}
2.6 consumer项目的启动类添加注解:@EnableDiscoveryClient、@EnableFeignClients
2.7 访问provider中接口的URL和consumer中接口的URL,成功。
内容太多了 我做了模块内容分离,springcloud的5个组件:feign、hystrix、ribbon、zuul、config都有博文分别介绍,如有需要请查看:
springcloud组件之一:feign(client)
springcloud组件之二:hystrix(容错&Hystrix处理容错&Feign项目的监控&Hystrix Dashboard可视化监控&Turbine聚合监控)
springcloud组件之三:Ribbon(轮询和随机负载)
springcloud组件之四:Zuul(zuul网关&网关过滤器)
springcloud组件之五:Config实现分布式配置