使用 Spring Cloud 构建微服务之调用 Eureka Client
2018/4/16
上一篇 注册了一个简单的 Servcie,这一篇讲一下使用 RestTemplate 来调用注册在 Eureka 上的服务。
Service Provider
先给 Service Provider 写一个简单的返回一个 Json 对象的 Api,Greeting
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class Greeting {
    private String name, message;
}
Root Api 直接返回一个 Greeting 对象
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
    @GetMapping("")
    public Greeting index() {
        Greeting greeting = new Greeting();
        greeting.setName("Jon")
                .setMessage("How are you");
        return greeting;
    }
}
结果:

微服务提供方已经 Ready。
Service Consumer
同样也是一个 Spring Boot 应用,同时也是 Eureka 的一个 Client。作为调用方,她是一个使用者。至于是否作为一个服务提供者,可以自由选择。
同样是通过 application.properties 配置 eureka 属性
server.port=8002
spring.application.name=service-consumer
eureka.client.register-with-eureka=true
eureka.client.enabled=true
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka
eureka.instance.prefer-ip-address=true这里设置 register-with-eureka 为 true,就会把 service-consumer 也注册为一个服务提供方。
可以看到 Service Consumer 也注册进 Eureka 了。

Eureka Services 之间如何通讯
有一个说法说 CS 有两个难题,一个是变量命名,另一个是 Cache Invalidation。 还有一个说话是,CS
中的问题,没有一个是不能通过加一层来解决了。这个 Eureka Server 就相当于是中间加的一层。
Consumer 调用 Provider
@RestController
public class HomeController {
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/")
    public String echo() {
        return "hello";
    }
    @GetMapping("/call-provider")
    public Object call() {
        Object result = restTemplate.getForObject("http://SERVICE-PROVIDER", Object.class);
        return result;
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplateBuilder().build();
    }
}
这里个 Consumer 添加了一个 /call-provider 方法,在方法内,通过 RestTemplate,调用了 provider 的 Api。
这里并没有使用 Url 地址或者 IP 地址,而是使用了注册在 Eureka Server 上的 application name,并且成功的得到了返回结果。
RestTemplate 的 LoadBalanced 注解来自 Spring Cloud 的 Ribbon 依赖。 Ribbon 是用来干什么的?
下篇再见~