3.springcloud_eureka服务发现(Finchle

2019-02-24  本文已影响0人  机智的jack

这是一个从零开始的springcloud的系列教程,如果你从中间开始看,可能会看不明白.请进入我的系列教程开始从头开始学习.spring-cloud教程

服务发现

在框架中,服务之间的相互调用不再通过传统的ip地址来寻找到对方.而是通过服务名称,然后向服务注册中心获取服务ip地址,然后再进行调用,达到动态化增加服务和自动化发现服务的目的.

传统方式调用:

服务A -> http请求(服务B的ip地址192.168.0.100:8001)->服务B收到

传统方式调用依赖静态配置,服务A有个配置文件,里面配置了服务B的ip地址

治理框架下调用:

服务A -> 向注册中心咨询服务B的地址或从缓存中获取 -> 得到地址后发起http请求(服务B集群状况下,是一组地址,根据轮询策略来决定使用哪个ip地址) -> 服务B收到

在使用服务治理框架来发现服务,使用者不再关心服务B的具体位置,只需要关心我想使用服务名称叫B的服务,哪怕服务B的ip变更也不影响服务A的调用.大大降低了维护成本.

发现服务

之前我们已经掌握了一个微服务如何将自己注册到服务治理中心(eureka-sevrer),将eureka-client2工程进行启动注册,服务名称为eureka-client2,端口为7772

Spring-Cloud通过DiscoveryClient来进行发现服务的操作,修改eureka-client工程的EurekaClientApplication类

package com.jack.eureka_client;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@SpringBootApplication
@RestController
//@EnableEurekaClient (Finchley.SR2已经不需要该配置了,你只需要在配置文件中含有eureka.client.enabled的配置即可)
public class EurekaClientApplication {
    

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

    private DiscoveryClient discoveryClient;
    
    // 得到DiscoveryClient
    @Autowired
    public void setDiscoveryClient(DiscoveryClient discoveryClient) {
        this.discoveryClient = discoveryClient;
    }
    
    @RequestMapping(value = "/discovery", method = RequestMethod.GET)
    public Object discovery() {
        // 获取服务名称列表
        List<String> names = discoveryClient.getServices();
        System.out.println("*******************" + names);
        StringBuilder builder = new StringBuilder();
        for (String name : names) {
            // 根据服务名称获取服务实例列表,可能是多个实例.
            List<ServiceInstance> instances = discoveryClient.getInstances(name);
            for (ServiceInstance instance : instances) {
                String info = instance.getServiceId() + "," +
                        instance.getHost() + "," +
                        instance.getPort() + "," +
                        instance.getUri() + "<br/>";
                System.out.println(info);
                builder.append(info);
            }
        }

        return builder.toString();
    }
}

http请求localhost:7771/discovery,得到两个服务实例信息,EUREKA-CLIENT,EUREKA-CLIENT2.

image.png

通过服务的详细信息动态的获取服务的ip地址,然后发送http请求.如果一个服务名称有多个实例,需要根据轮询策略来决定请求哪个具体实例,为此需要写代码去做这方面的处理.幸运的是spring-cloud已准备了工具,不需要再进行编写了.


总结

经过上面的讲解,已经了解服务发现的概念,以及如何用代码来发现服务.不过以上还不足以让我们方便的进行服务之间的调用.SpringCloud提供两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。接下来我们会对两种方法进行深入的讲解.

上一篇下一篇

猜你喜欢

热点阅读