服务发现是 服务治理的一个很重要的点
所有注册在服务平台的微服务 必须要能被发现 然后调用
而我们调用其他服务一般有三种方法
DiscoverClient ribbon Feign
DiscoverClient 是更加低层的方法 当DiscoverClient 需要寻找服务时 其实是向服务注册器(例如 eureka) 发送 http 请求获取躯体服务信息 包括 ip port 等
@SpringBootApplication
@EnableDiscoveryClient
class Application {
@Autowired
DiscoveryClient discoveryClient
}
添加了注解@EnableDiscoveryClient
然后就能自动 注入 discoverClient
@Autowired
DiscoveryClient discoveryClient
def restTemplate = new RestTemplate()
def serverList = discoveryClient.getInstances("ROBIN-ADMIN")
println(serverList)
restTemplate.getForObject("${serverList[0].getUri()}/api/ribbon",Map.class)
获取到discoverClient 就能通过 服务名字 查找服务实例 并且通过RestTemplate 调用服务接口了
Ribbon是调用了 discoverClient 调用服务的 但是他提供了 负载均衡功能,不显式调用某个服务实例 而是通过策略调用某类服务的其中一个 达到负载均衡效果
@SpringBootApplication
class RibbonApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate()
}
}
在注册RestTemplate对象时 添加LoadBalanced 注解
LoadBalanced 会自动实例化restTemplate 的服务均衡策略 具体查看LoadBalance接口 会定时ping各个服务实例 也会用譬如 回环轮询策略 寻找服务实例
当restTemplate 调用服务时 通过策略调用服务实例
restTemplate.getForObject("http://ROBIN-ADMIN/api/health",Map.class)
ROBIN-ADMIN 为某类服务的服务ID
Feign 是更加接近业务的服务调用方式
maven 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加Feign注解
@EnableFeignClients
class RibbonApplication {
}
新建接口对象
package org.robin.ribbon.feign
import org.springframework.cloud.openfeign.FeignClient
import org.springframework.web.bind.annotation.RequestMapping
@FeignClient("ROBIN-ADMIN")
interface RobinAdminService {
@RequestMapping("/api/ribbon")
Map ribbon()
@RequestMapping("/api/health")
Map health()
}
spring会自动生成 RobinAdminService
调用该对象的方法 可以 调用对应微服务的接口