SpringCloud微服务Eureka

作者: 青衣敖王侯 | 来源:发表于2019-03-23 11:48 被阅读27次

    什么是Eureka

      Eureka是SpringCloud的注册中心,在分布式系统中是最重要的基础部分。

    注册中心的重要性

      1.服务发现
      2.负载均衡

    分布式中为什么需要服务发现

      如下图所示,没有注册中心的时候,节点之间通信,都必须要知道对端的IP和端口,如果节点数量少还好,但是如果节点成千上万,就非常难维护了,而且我们也知道节点也有可能会出现挂掉的情况,如果节点挂掉了,怎么避免连接到失效的节点上这也是注册中心需要解决的问题。



      有了注册中心后,如下图所示,如果A要调用B,B有多个实例,那么实例每启动一个都会到注册中心去报到,这个时候,A想调用B,直接到注册中心去拿地址就可以了。其实注册中心有点像老鸨,你去醉月楼的时候不可能直接站在里面说,如花在哪里,花魁在哪里,你第一时间接触到的就是老鸨,然后老鸨告诉你XX在哪里,XXX在哪里,就是这么个意思~~



    那么有了服务发现,那么我可以想一想,A调用B可以怎么调用?第一种是客户端的发现方式,即A从注册中心拿到了一堆B的名单,然后从名单中自己选择一个,可以使用轮询、hash等等,然后去访问B。第二种服务发现方式是服务端发现方式:如下图所示,就是通过一个代理帮你找到一个地址,然后告诉A去调用

    思考

      1.客户端调用方式的优点:客户端知道所有的调用地址。缺点:要自
    己写代码去选择地址调用
      2.服务端调用方式的优点:不用自己写代码了。缺点:要调用的服务地址对我们来说是透明的
      3.如果让我们做一个注册中心,注册中心仅仅支持Java语言可行吗?当然是不行的,因为微服务的特点是异构性,何为异构,就是不同的语言,不同的数据库类型。所以SpringCloud采用了Rest的调用方式,可以让非Java语言的客户端注册到Eureka上面来。比如node.js就使用eureka-js-client来注册到Eureka上面来。

    Eureka 服务端配置

    1.Java代码

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
        }
    
    }
    

    2.POM文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.eureka</groupId>
        <artifactId>eureka</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>eureka</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    

    3.配置文件

    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
        register-with-eureka: false
      server:
        enable-self-preservation: false
    spring:
      application:
        name: eureka
    server:
      port: 8761
    

    Eureka 客户端配置

    1.Java代码

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ClientApplication.class, args);
        }
    
    }
    

    2.POM文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.eureka</groupId>
        <artifactId>client</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>client</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <dependencyManagement>
            <dependencies>
    
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    3.配置文件

    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka
      instance:
        hostname: zzm
    spring:
      application:
        name: client
    

    注意事项:

      1.eureka client一定要添加web依赖,否则无法注册上去,这是一个很隐蔽的坑。
      2.然后这里我采用了多个Eureka服务端,为了保证其高可用性
      3.instance.hostname的配置可以让我们在eurekaserver控制界面点击对应的服务项时,可以跳转到我们想去的地方

    Eureka总结

      1.需要Server和Client,Server用于保存服务的注册信息和client进行通信,client用于注册自己的服务,或者到server端获取要调用的服务的地址,并保持与server的心跳信息
      2.Eureka具有心跳检测机制、健康检查、负载均衡等功能
      3.Eureka具有高可用性,在生产上我们尽可能要部署两台以上
      4.这是我最后要讲的一句话,为什么要写在这里,主要是不想让大家略过这篇文章,Eureka在SpringBoot 2.0之后就已经不再维护了,但是它是我们理解注册中心的一个很好的框架,现阶段比较流行的就是Consul这个东西了,我会在后面的文章中给大家分享Consul。

    相关文章

      网友评论

        本文标题:SpringCloud微服务Eureka

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