阿里系:Dubbo-服务化治理;Zookeeper-服务注册中心;SpringMVC或SpringBoot。
SpringCloud全家桶:SpringCloud Netflix Eureka;SpringBoot。
是什么:
作用:简化了分布式开发。
概念:
构建Eureka服务注册中心 —— Eureka Server
1. 新建Spring Initializer——>应用名:eureka——>添加依赖:Spring Cloud Discovery—EurekaServer——>项目位置选择:自定义空文件夹\eureka。
2. 在pom.xml中将SpringBoot版本和SpringCloud版本修改成文章开头设定的版本:
org.springframework.boot
spring-boot-starter-parent
2.0.0.M3
Finchley.M2
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
3. 启动类中添加注解:@EnableEurekaServer,声明注册中心的功能。
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
4. 启动项目(由于服务没被注册,会报错,但没关系),访问:http://IP:端口/,即可进入注册中心。为了将自身服务注册到自身应用中,可以添加如下配置到application.yml配置文件中:本例中项目启动后访问—— http://localhost:8761/ 进入Eureka服务注册中心。
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
register-with-eureka: false # 注册的应用服务列表中不显示自己本身(自身也是个服务)
server:
enable-self-preservation: false # 自我保护机制关闭
spring:
application:
name: eureka
server:
port: 8761
5. 在cmd中使用命令:maven clean package -Dmaven.test.skip=true 打包项目,使其不依赖idea,可以独立运行。运行命令:java -jar eureka-0.0.1.SNAPSHOT.jar 即可启动项目。也可以 后台启动。若在后台运行,启动后关闭的命令如下(管理员模式打开cmd):tasklist | findstr "java";查看java线程的PID。杀死线程:taskkill /pid 12123 /f (win系统也可在任务管理器中杀死java线程)。即可关闭项目。(linux:ps -ef | grep jarName.jar kill -9 pid)
构建一个Eureka服务注册中心 —— Eureka Client
1. 新建Spring Initializer——>应用名:client——>添加依赖:Spring Cloud Discovery—EurekaDiscovery——>项目位置选择:自定义文件夹\client。
2. pom依赖中统一SpringBoot和SpringCloud的版本。然后在application.yml中进行服务注册的如下配置(不配置则不能被注册到EurekaServer服务注册中心)。并且还需要在项目启动类中添加服务发现注解@EnableDiscoveryClient。
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: client
3. 启动项目,然后前往 服务注册中心(http://localhost:8761/)查看。实际项目启动时,一直失败,添加web依赖后才启动成功。成功后可以看到 Application表单中已经有了新增加的client服务。
org.springframework.boot
spring-boot-starter-web
4. Eureka页面中红字(EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE)的出现原因:https://cloud.tencent.com/developer/article/1152507。server通过心跳机制检查client端,判断其是否还在线上运行。当client不在线上运行时,保护机制仍会视为在线(如下图已关闭client应用)。在开发环境中,最好关闭该模式。在server端的applicaton.yml配置中配置:server: enable-self-preservation: false。(结果启动服务后又tm出现红字:THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.cou!我这强迫症哦!)
5. 除Eureka-server外,其他创建的所有业务服务都是eureka的客户端,(例如:商品管理模块、订单管理模块等),即其他的springboot项目都是eureka的客户端,都需要配置yml将服务注册到eureka中,在启动类中添加@EnableDiscoveryClient注解。
Eureka的高可用
1. 高可用:为避免服务宕机,可以创建多个Eureka服务注册中心,通过之间的相互注册创建联系。(使用不同的端口启动eureka服务端即可实现多服务注册,修改application.yml的注册地址即可实现相互创建联系)。
2. 创建两个测试类:
3. 在启动application1时,将application.yml的注册地址修改成 eureka: client: service-url: defaultZone: http://localhost:8762/eureka。然后在启动application2时,将application.yml的注册地址端口修改为 8761.即可模拟启动两个eureka的服务端。启动成功后,分别访问 localhost:8761和localhost:8762即可进入两个服务的注册中心。
4. 启动eureka的客户端。虽然client的注册端口仍然是8761,但是client会被两个eureka注册。因为被8761的服务同步了。此时挂掉eureka1,eureka2和client都不会受到影响。从而实现了高可用。但是若重启了client,则client会报错,因为请求注册的地址服务已经不在了。但由于心跳机制,eureka2中注册的客户端仍然存在,也只是服务的“自我欺骗”。
5. 为了实现eureka挂掉一个,client重启也不会受到影响,那么只需要每次都将client注册到两个eureka服务中即可。修改client的application.yml配置:(此时挂掉任何一个eureka服务都不会被影响了。)
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
spring:
application:
name: client
6. 如果是三个eureka,那么需要eureka的服务两两相互注册,客户端也需要注册三个eureka服务中心。(服务端:8761端口的注册到8762和8763,8762的端口注册到8761和8763,8763端口的注册到8761和8762。客户端注册到8761、8762、8763)。
微服务特点:由一系列微小的服务共同组成;单独部署,运行在自己的进程中;每个服务为独立的业务开发;分布式管理。(异构——不同编程语言、不同类型的数据库。)
不适合使用微服务框架的业务形态:系统中包含很多强事务的场景;业务相对稳定成熟,迭代周期长;访问压力小,可用性要求不高。
康威定律和微服务:任何组织在设计一套系统(广义概念的系统)时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。简而言之:沟通的问题会影响系统的设计。
源码
其他相关博客以供学习和参考:https://blog.csdn.net/qq_35275233/article/details/89041647