01.简单的例子:第一个EurekaClient(后面简称A Client)中的一个接口
@RestController
public class UserService{
@RequestMapping(value = "/login", method = RequestMethod.POST)
public boolean login(@RequestParam("name") String name,@RequestParam("pwd") String pwd) throws Exception {
return "admin".equals(name) && "123456".equals(pwd) ;
}
}
02.现在第二个EurekaClient(后面简称B Client)想要调用A Client中的那个接口,那么需要在B Client中添加Frein依赖来实现
01>.导入Feign依赖(Feign的依赖已经包含了Hystrix的依赖)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
注意:B Client作为一个Eureka Client,当然在yml少不了client相关的一些配置并且开启hystrix
server:
port:8081 //作为一个web项目,端口必须的配置
spring:
application:
name:user-customer //eureka client的名字
eureka:
client:
service-url:
defaultZone:http://localhost:7777/eureka/
feign:
hystrix:
enabled:true //开启hystrix
02>.主类上面添加注解@EnableFeignClients,该注解表示当程序启动时,会进行包扫描,默认扫描所有带@FeignClient注解的类进行处理
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class FeignOpenClientApplication {
...
}
03>.写个interface,用feign来调用;使用@FeignClient为本应用声明一个简单的能调用Client。其中参数name为A Client的name,fallback为这个接口调用失败之后,会去fallback这个类中去调用。
@FeignClient(name = "user-provider, fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
//这里面的方法和参数名必须和A Client中的保持一致
@RequestMapping(value = "/login", method = RequestMethod.POST)
public boolean login(@RequestParam("name") String name,@RequestParam("pwd") String pwd) ;
}
然后可以实现这个借口来用hystrix做这个异常处理,实现的这个类命名一般以Fallback结尾。
@Component //备用组件 当login挂掉之后,会走这个里面
public class UserFeignClientFallback implements UserFeignClient {
@Override
public boolean login(@RequestParam("name") String name,@RequestParam("pwd") String pwd) {
// 出现异常会走到这一步
return false;
}
}
04>.那么接下来 就直接在B Client中调用上面的接口,就相当于直接调用到A Client中的login方法
@RestController
public class LoginController{
@Autowired 注入上面的接口,则会自动被创个出一个实现类
private UserFeignClient userFeignClient;
@RequestMapping(value = "/userlogin", method = RequestMethod.GET)
public String login(@RequestParam("name") String name,@RequestParam("pwd") String pwd) {
if userFeignClient.login(name,pwd) {
return "login success"
}
}
}
03.复杂的公共的数据在多个Eureka client中传递,可以创建个简单的maven工程来做这个数据模型
// 例如
public class User {
private String username;
private String password;
...然后生成set get方法...
}
然后 install -> Run Maven Build,这样就安装到本地仓库,其它Eureka client就可以发现这个maven工程。
此时就可以在A Client和B Client中导入这个依赖(这个common Maven的坐标),这样在A Client中就可以使用这个User对象了。
@RestController
public class UserService{
@RequestMapping(value = "/login", method = RequestMethod.POST)
public boolean login(@RequestBody User user) throws Exception {
return "admin".equals(user.getUsername) && "123456".equals(user.getPassword) ;
}
}
网友评论