使用Feign调用注册在Eureka中的远程服务(入门)

上篇文章如何使用Ribbon实现服务负载均衡、结合Eureka、简单定义策略,我们简单的使用了一下ribbon实现服务负载均衡的功能.在之前的文章中我们都是直接使用RestTemplate,当然了,也不是说这种方式不好,但是更普遍的是使用Feign来调用。本篇文章是为后面使用Hystrix来进行服务降级做个小小铺垫。废话不多说,让我们看看是如何使用Feign来进行服务调用。注:Feign的官方文档说明
我们仍然使用前面建立的三个工程(eureka-server,userreg,myweb)。

1.myweb

第一步:添加依赖,我们在myweb工程中添加Feign依赖

...

            org.springframework.cloud
            spring-cloud-starter-feign
  
...

第二步:添加注解,在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 reg();

    @RequestMapping("/getUser/{uid}")
    public Map 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 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 test() {
        Map 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 reg()
    {
        Map map=new HashMap();
        map.put("status","用户注册成功");
        return map;
    }
    @RequestMapping("/getUser/{uid}")
    public Map getUser(@PathVariable("uid") int uid)
    {
        Map map=new HashMap();
        map.put("status","用户id:"+uid);
        return map;
    }
}

这样就实现了Fegin的简单调用服务。在实际开发中,我们更普遍的是使用Fegin,建立一个接口,将服务罗列之后,在controller层进行二次包装调用。上例中的test接口,就是如此,先是调用获取user的服务,如果获取成功,则调用reg注册的服务进行调用。这其中的妙处可以细细体会一下。
学到目前为止,相较于传统单机架构,微服务架构优势貌似并未体现多少,甚至还会有疑问,服务之间的有了关系之后难道不会造成服务之间的互相影响吗?比如服务a调用服务b,服务b调用服务c,如此交错调用,万一服务c崩溃会造成与其相关的服务也会受到影响,那这个问题怎么解决呢?
下一篇我们学习Hystrix之服务降级

你可能感兴趣的:(使用Feign调用注册在Eureka中的远程服务(入门))