所谓服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。java
服务注册中心node
springcloud支持的多种注册中心Eureka(netflix)、Consul、Zookeeper、以及阿里巴巴推出Nacos组件。git
这些注册中心在本质上都是用来管理服务的注册和发现以及服务状态的检查的。github
# 0.简介 - https://github.com/Netflix/eureka/wiki - Eureka是Netflix开发的服务发现框架,自己是一个基于REST的服务。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务注册和发现功能。 Eureka包含两个组件:Eureka Server和Eureka Client。
单体应用 ------> 分类服务 商品服务 订单服务 用户服务......web
Eureka Server 组件 : 服务注册中心组件 管理全部服务 支持全部服务注册算法
Eureka Client 组件 : 分类服务 商品服务 订单服务(微服务)spring
开发Eureka Serverapache
<?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 https://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.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.md</groupId> <artifactId>02-eurekaserver8761</artifactId> <version>0.0.1-SNAPSHOT</version> <name>02-eurekaserver8761</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <!--定义springcloud使用版本号--> <spring-cloud.version>Hoxton.SR6</spring-cloud.version> </properties> <dependencies> <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> <!--引入 eureka server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <!--全局管理springcloud版本,并不会引入具体依赖--> <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>
server.port=8761 #执行服务端口 spring.application.name=eurekaserver #指定服务名称 惟一标识 eureka.client.service-url.defaultZone=http://localhost:8761/eureka #指定服务注册中心的地址
@SpringBootApplication @EnableEurekaServer public class Eurekaserver8761Application { public static void main(String[] args) { SpringApplication.run(Eurekaserver8761Application.class, args); } }
eureka server 服务注册中心 & client 微服务windows
仍是在application.properties浏览器
server.port=8761 spring.application.name=eurekaserver eureka.client.service-url.defaultZone=http://localhost:8761/eureka eureka.client.register-with-eureka=false #再也不将本身同时做为客户端进行注册 eureka.client.fetch-registry=false #关闭做为客户端时从eureka server获取服务信息
开发Eureka Client
项目拆分出来的一个个微服务
<?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 https://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.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.md</groupId> <artifactId>02-eurekaserver8888</artifactId> <version>0.0.1-SNAPSHOT</version> <name>02-eurekaserver8888</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <!--定义springcloud使用版本号--> <spring-cloud.version>Hoxton.SR6</spring-cloud.version> </properties> <dependencies> <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> <!--引入eureka client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <!--全局管理springcloud版本,并不会引入具体依赖--> <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>
server.port=8888 spring.application.name=eurekaclient8888 #服务名称惟一标识 eureka.client.service-url.defaultZone=http://localhost:8761/eureka #eureka注册中心地址
@SpringBootApplication @EnableEurekaClient public class Eurekaclient8888Application { public static void main(String[] args) { SpringApplication.run(Eurekaclient8888Application.class, args); } }
# 0.服务频繁启动时 EurekaServer出现警告 - EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
1.自我保护机制
2.在eureka server端关闭自我保护机制
eureka.server.enable-self-preservation=false #关闭自我保护 eureka.server.eviction-interval-timer-in-ms=3000 #超时3s自动清除
3.微服务修改减短服务心跳的时间
eureka.instance.lease-expiration-duration-in-seconds=10 #用来修改eureka server默认接受心跳的最大时间 默认是90s eureka.instance.lease-renewal-interval-in-seconds=5 #指定客户端多久向eureka server发送一次心跳 默认是30s
4.尽管如此关闭自我保护机制仍是会出现警告
7.eureka 中止更新
# 1.官方中止更新说明 - https://github.com/Netflix/eureka/wiki - 在1.x版本项目仍是活跃的,可是在2.x版本中中止维护,出现问题后果自负!!!
consul 服务注册中心 启动consul服务注册中心 运行
consul 客户端 将springcloud 客户端(微服务)
consul 简介
windows下启动consul
consul的服务端
# 1.建立boot项目并引入consul客户端依赖
<?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 https://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.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.md</groupId> <artifactId>03-consulclient8889</artifactId> <version>0.0.1-SNAPSHOT</version> <name>03-consulclient8889</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <!--定义springcloud使用版本号--> <spring-cloud.version>Hoxton.SR6</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--引入consul依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> </dependencies> <!--全局管理springcloud版本,并不会引入具体依赖--> <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>
# 2.编写properties配置
server.port=8889 spring.application.name=consulclient8889 spring.cloud.consul.host=localhost #注册consul服务的主机 spring.cloud.consul.port=8500 #注册consul服务的端口号
# 3.启动服务查看consul界面服务信息
# 1.开启consul健康监控 - 默认状况加consul监控健康是开启的,可是必须依赖健康监控依赖才能正确监控健康状态因此直接启动会显示错误,引入健康监控依赖以后服务正常
<!-- 这个包是用作健康度监控的--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
server.port=8889 spring.application.name=consulclient8889 spring.cloud.consul.host=localhost #注册consul服务的主机 spring.cloud.consul.port=8500 #注册consul服务的端口号 spring.cloud.consul.discovery.register-health-check=false #关闭consu了服务的健康检查[不推荐] spring.cloud.consul.discovery.service-name=${spring.application.name} #指定注册的服务名称 默认就是应用名
服务注册中心集群 node1 node2 node3 ... eureka(AP) consul zk(CP)