springcloud和Dubbo的对比
RPC就是一台服务器上的代码调用另一台服务器上代码里的方法
- dubbo的分布式治理核心是zookeeper
- zookeeper是dubbo的分布式治理核心
- zookeeper是CA (如果一个节点挂了就直接拒绝服务(强一致性))
- zookeeper有主从关系
- springcloud的分布式治理核心是eureka
- Eureka是springcloud的分布式治理的核心
- Eureka是 AP
- Eureka没有主从关系,每个节点都保留数据的副本然后互相之间进行数据的同步。如果一个节点挂了可能会保存一段时间的服务列表(高可用性)有数据不一致的分险。
配置Eureka
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>
<groupId>com.guohe3</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<fastjson.version>1.2.45</fastjson.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--增加eureka-server的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
复制代码
application.yml的配置
server:
port: 8888
eureka:
instance:
hostname: eureka
client:
register-with-eureka: false #本身不需要去注册服务
fetch-registry: false #一个服务的时候不需要设置为true
service-url: #配置一个map
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
复制代码
然后去新建一个springcloud工程作为服务提供者,注册服务的client pom文件和上面一样只是把
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
复制代码
改成
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
复制代码
application.properties配置
server.port=8083
spring.application.name=hello #根据名称来标识是否属于一组服务
eureka.client.service-url.defaultZone=http://localhost:8888/eureka/
复制代码
运行结果:
- 此时默认是开启了自我保护模式的,当服务不可用的时候注册中心不会去踢掉它(下面会讲如何取消自我保护)
- 根据spring.application.name=hello 来区分是否是一套服务
注册中心集群配置
一个服务注册中心容易发生单点故障,所以要配置集群
准备四个springcloud工程,两个注册服务,两个服务提供者pom文件配置和上述一样
server1配置:
server:
port: 8888
eureka:
instance:
hostname: eureka
lease-expiration-duration-in-seconds: 90 #续约超时时间
lease-renewal-interval-in-seconds: 30 #续约请求间隔时间
client:
service-url:
defaultZone: http://localhost:8889/eureka/ #服务注册url是另一个注册中心的,以此来相互注册
registry-fetch-interval-seconds: 30 #服务列表要定时刷新防止请求已经过时的服务
server:
enable-self-preservation: false #关闭自我保护
spring:
application:
name: eureka-server #必须要配置
复制代码
server2配置
server:
port: 8889
eureka:
instance:
hostname: eureka2
client:
service-url:
defaultZone: http://localhost:8888/eureka/
server:
enable-self-preservation: false
spring:
application:
name: eureka-server
复制代码
server1和server2的主要配置是端口不同,服务注册的url是对方的,hostname不能一样
client1配置
server.port=8081
spring.application.name=hello
eureka.client.service-url.defaultZone=http://localhost:8888/eureka/,http://localhost:8888/eureka/
复制代码
client2配置
server.port=8082
spring.application.name=hello
eureka.client.service-url.defaultZone=http://localhost:8888/eureka/,http://localhost:8888/eureka/
复制代码
client1和client2的主要区别是端口不同,注意,应用名称必须是一样的才算是一组服务,url.defaultZone逗号隔开多个服务的url
启动结果
服务调用者从服务注册中心获取可用服务列表,然后通过负载均衡选择调用哪个服务Eureka 工作原理
心跳和续约的区别:
心态:注册中心会不断发送请求确认服务是否可用
续约:服务向注册中心发送请求来更新到期时间,进行续约。