美文网首页
3.springcloud_eureka服务发现(Finchle

3.springcloud_eureka服务发现(Finchle

作者: 机智的jack | 来源:发表于2019-02-24 22:10 被阅读0次

    这是一个从零开始的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。接下来我们会对两种方法进行深入的讲解.

    相关文章

      网友评论

          本文标题:3.springcloud_eureka服务发现(Finchle

          本文链接:https://www.haomeiwen.com/subject/tqciyqtx.html