上篇文章如何使用Ribbon实现服务负载均衡、结合Eureka、简单定义策略,我们简单的使用了一下ribbon实现服务负载均衡的功能.在之前的文章中我们都是直接使用RestTemplate,当然了,也不是说这种方式不好,但是更普遍的是使用Feign来调用。本篇文章是为后面使用Hystrix来进行服务降级做个小小铺垫。废话不多说,让我们看看是如何使用Feign来进行服务调用。注:Feign的官方文档说明
我们仍然使用前面建立的三个工程(eureka-server,userreg,myweb)。
1.myweb
第一步:添加依赖,我们在myweb工程中添加Feign依赖
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
...
第二步:添加注解,在application中添加@EnableFeignClients注解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class MywebApplication {
public static void main(String[] args) {
SpringApplication.run(MywebApplication.class, args);
}
}
第三步:建立业务注解接口
@RestController
@FeignClient(name = "USERREG")/*该处的name是服务中心某服务的注册的名称*/
public interface MyUser {
@RequestMapping("/reg")
public Map<String, String> reg();
@RequestMapping("/getUser/{uid}")
public Map<String, String> getUser(@PathVariable("uid") int uid);
}
第四步:注入该接口实例进行调用,我们使用Autowired注解将MyUser这个接口注入,直接调用服务
@RestController
public class Myweb {
@Autowired
DiscoveryClient discoveryClient;
@Autowired
LoadBalancerClient mLoadBalancerClient;
@Autowired
MyUser myUser;
@RequestMapping("/userreg")
public Map userreg() {
// List<ServiceInstance> list = discoveryClient.getInstances("USERREG");
// String serviceUrl = list.get(0).getUri().toString();
/*robbinz负载均衡实现*/
ServiceInstance userreg = mLoadBalancerClient.choose("USERREG");
String serviceUrl = userreg.getUri().toString();
System.out.println(serviceUrl);
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(serviceUrl + "/reg", Map.class);
}
@RequestMapping("/test")
public Map<String, String> test() {
Map<String, String> user = myUser.getUser(256);
if (null != user) {
return myUser.reg();
}
return null;
}
}
2.eureka-server
不变
3.userreg
添加一个接口服务,其余不变,如下:
@RestController
public class UserController {
@RequestMapping("/reg")
public Map<String,String> reg()
{
Map<String,String> map=new HashMap<String, String>();
map.put("status","用户注册成功");
return map;
}
@RequestMapping("/getUser/{uid}")
public Map<String,String> getUser(@PathVariable("uid") int uid)
{
Map<String,String> map=new HashMap<String, String>();
map.put("status","用户id:"+uid);
return map;
}
}
这样就实现了Fegin的简单调用服务。在实际开发中,我们更普遍的是使用Fegin,建立一个接口,将服务罗列之后,在controller层进行二次包装调用。上例中的test接口,就是如此,先是调用获取user的服务,如果获取成功,则调用reg注册的服务进行调用。这其中的妙处可以细细体会一下。
学到目前为止,相较于传统单机架构,微服务架构优势貌似并未体现多少,甚至还会有疑问,服务之间的有了关系之后难道不会造成服务之间的互相影响吗?比如服务a调用服务b,服务b调用服务c,如此交错调用,万一服务c崩溃会造成与其相关的服务也会受到影响,那这个问题怎么解决呢?
下一篇我们学习Hystrix之服务降级









网友评论