SpringCloud学习笔记SpringCloud技术积累

SpringCloud微服务Eureka

2019-03-23  本文已影响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。

上一篇下一篇

猜你喜欢

热点阅读