什么是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。