在前言中(springBoot集成springCloud前言)我们介绍了一些springCloud一些组件。接下来我们就一个一个介绍。
一:概念
1、什么是服务治理
SpringCloud封装了Netflix公司开发的Eureka模块来实现服务治理
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
2、什么是服务注册与发现
Eureka采用了CS的设计结构,Eureka Server服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。这点和zookeeper很相似
在服务注册与发现中,有一个注册中心。当服务器启动时候,会把当前自己服务器的信息 比如服务地址 通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用。RPC远程调用框架核心设计思想:在于注册中心,因为便用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址)
3、Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
EurekaClient通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
二:注册中心之Eureka
Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
上图简要描述了Eureka的基本架构,由3个角色组成:
1、Eureka Server
- 提供服务注册和发现
2、Service Provider
- 服务提供方
- 将自身服务注册到Eureka,从而使服务消费方能够找到
3、Service Consumer
- 服务消费方
- 从Eureka获取注册服务列表,从而能够消费服务
1:单机Eureka构建
Server模块(三板斧)
首先 :pom.xml文件
需要有springBoot包和springCloud包。
<!-- 统一管理 jar 包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</dependency>
<!-- 下面三个基本是微服务架构的标配 -->
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>
<!-- druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
其次:application.properties
server.port=7001
## eureka 服务器的实例名称
eureka.instance.hostname=localhost
#false代表不向服务注册中心注册自己,因为它本身就是服务中心
eureka.client.register-with-eureka=false
# false 代表自己就是服务注册中心,自己的作用就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://localhost:${server.port}/eureka/
最后:要在启动类中添加@EnableEurekaServer
可通过: http://localhost:${server.port}
Client模块(三板斧)
首先:pom.xml要添加springBoot和Cloud
在Server的基础上将server改成client就可以了。
<!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
其次:配置文件要添加application.properties
server.port=8001
server.servlet.context-path=/cloudClient1
## 在Eureka页面中显示服务
spring.application.name=spring-cloud-producer
# 注册进 Eureka 的服务中心
eureka.client.register-with-eureka=true
# 检索服务中心的其它服务
# 单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
eureka.client.fetch-registry=true
# 设置与 Eureka Server 交互的地址
eureka.client.service-url.defaultZone=http://localhost:7001/eureka/
最后:要在启动类中添加@EnableEurekaClient
我们就可以在Eureka的页面中看到是否注册成功。
在client客户端可能出现启动不了的情况,错误如下;
Unregistering application UNKNOWN with eureka with status DOWN
解决方法:pom文件加入 web 架包。
在pom.xml中加入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
java项目启动不需要容器,但是springCloud项目都是web项目,所以需要容器才能启动。
2:集群Eureka构建
我们在1:单机版本的基础上添加集群
(1):配置映射
找到C:\Windows\System32\drivers\etc路径下的hosts文件,修改映射配置添加进hosts文件,因为浏览器不识别eureka7001.com,不添加会导致后面的服务找不到注册中心的地址。
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
(2):Server修改
在单机版本的Server的基础上,再复制一份Server标记端口改为7002
与单机版不同的是,defaultZone指向了其他注册中心的地址
7001配置
server.port=7001
## eureka 服务器的实例名称
eureka.instance.hostname=eureka7001.com
#false代表不向服务注册中心注册自己,因为它本身就是服务中心
eureka.client.register-with-eureka=false
# false 代表自己就是服务注册中心,自己的作用就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://eureka7002.com:${server.port}/eureka/
7002配置
server.port=7002
## eureka 服务器的实例名称
eureka.instance.hostname=eureka7002.com
#false代表不向服务注册中心注册自己,因为它本身就是服务中心
eureka.client.register-with-eureka=false
# false 代表自己就是服务注册中心,自己的作用就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
# 设置与 Eureka Server 交互的地址,查询服务 和 注册服务都依赖这个地址
# 集群指向其他eureka
eureka.client.service-url.defaultZone=http://eureka7001.com:${server.port}/eureka/
(3):client修改
client修改就比较简单只需要配置
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/