nginx负载均衡原理 服务器负载均衡是什么意思( 二 )


2.2通过服务ID找到服务在微服务Spring Cloud快速入门中我们定义了如下Feign接口,在这个接口上面,我们添加了一个注解@FeignClient,指定了服务ID:hutao-microservice-item 。这个Feign接口会给我发起Http调用 。当然在这里我们可能无法看到负载均衡的效果,因此我们需要稍微深入下底层代码 。
@FeignClient(value = "https://www.520longzhigu.com/shenghuo/hutao-microservice-item")@RequestMapping("/itemservice")public interface FeignOrderService {/*** @Description:使用声明式HTTP客户端发起请求:根据ID查询订单* @author hutao* @mail [email protected]* @date 2020年8月30日*/ @GetMapping(value = "https://www.520longzhigu.com/shenghuo/item/{itemId}") Items queryItem(@PathVariable("itemId")String itemId);}大家应该还记得,我们的商品服务和订单服务,注册到注册中心的时候,我们在启动类上面添加了一个注解:@EnableDiscoveryClient 。
现在我们来看下DiscoveryClient这个接口
2.2.1.DiscoveryClient 解读DiscoveryClient接口源码如下,他是用来发现服务的,比如发现Netflix服务,其中有个方法List getInstances(String serviceId)是根据服务ID获取服务实例集合 。
/** * Represents read operations commonly available to discovery services such as Netflix * Eureka or consul.io. * * @author Spencer Gibb * @author Olga Maciaszek-Sharma */public interface DiscoveryClient extends Ordered { /*** Default order of the discovery client.*/ int DEFAULT_ORDER = 0; /*** A human-readable description of the implementation, used in HealthIndicator.* @return The description.*/ String description(); /*** Gets all ServiceInstances associated with a particular serviceId.* @param serviceId The serviceId to query.* @return A List of ServiceInstance.*/ List<ServiceInstance> getInstances(String serviceId); /*** @return All known service IDs.*/ List<String> getServices(); /*** Default implementation for getting order of discovery clients.* @return order*/ @Override default int getOrder() {return DEFAULT_ORDER; }}我们可以看到DiscoveryClient 有4个实现,当然这里我们用的肯定是Eureka 。
2.2.2.使用DiscoveryClient获取服务实例现在我们来使用下DiscoveryClient 这个接口
首先把这个接口依赖注入到我们的Controller中,我们看下能获取到什么
@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping(value = "https://www.520longzhigu.com/shenghuo/order/{orderId}")public Order queryOrderById(@PathVariable("orderId") String orderId) { String serviceId = "hutao-microservice-item"; List<ServiceInstance> instances = discoveryClient.getInstances(serviceId); System.out.println(instances); return null;}通过调试代码,我们发现如我们之前所说,我们可以通过服务ID:hutao-microservice-item,找到两个服务实例 。
查看每个实例,我们发现我们能够看到每个服务的地址,端口等信息
如果不使用Feign这种声明式的调用Http请求,那我们来如何调用?
2.2.3.从服务实例中获取服务信息,发起Http请求那么这个时候,我们怎么去发起请求恩?很简单,就是从服务实例中,获取到服务信息后,将接口的请求地址拼接出来 。然后使用restTemplate发起Http请求
@Autowiredprivate RestTemplate restTemplate;@GetMapping(value = "https://www.520longzhigu.com/shenghuo/order/{orderId}")public Order queryOrderById(@PathVariable("orderId") String orderId) { String serviceId = "hutao-microservice-item"; List<ServiceInstance> instances = discoveryClient.getInstances(serviceId); ServiceInstance serviceInstance = instances.get(0); String url = serviceInstance.getHost() + ":" + serviceInstance.getPort(); Items items = restTemplate.getForObject("http://" + url + "/itemservice/item/1" , Items.class); System.out.println(items); return null;}可以看到我们的请求是能正常访问的 。当然也有问题存在,那就是我们拿到的是多个服务,程序怎么知道我要调用的是哪一个服务呢?


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: