项目开发练习涉及的模块
- Eureka:负责服务发现相关。Eureka Server/Client、高可用、服务发现机制。
- Config:负责统一配置中心。Config Server/Client、SpringCloudBus+RabibtMQ实现配置自动刷新。
- Ribbon:服务通信。RestTemplate和Feign通信方法、Ribbon实现原理。
- Zuul:APIgateWay。动态路由、校验。
- Hystrix:熔断机制。Hystrix Dashboar熔断机制。
- 容器编排:Docker+Rancher
- 服务追踪:SpringCloud Sleuth + Zipkin
- 环境参数:SpringBoot2.0.0M3,SpringCloud Finchley.M2(可在官网查看SpringCloud和SpringBoot版本对应关系。实际上操作中,使用的是 SpringBoot 2.0.6.RELEASE,SpringCloud Finchley.SR2)。
微服务概念
- 由一系列微小的服务共同组成。
- 在自己的进程中运行,互不干扰。
- 每个服务为独立的业务开发。
- 独立部署,每个服务可以独立部署。
- 分布式的管理。(微服务是一种架构风格)
涉及的架构形态
- 单体架构。优点:容易测试;容易部署。缺点:开发效率低;代码维护困难;部署不灵活;扩展性不够;稳定性差。
- 基于AJAX前后端分离。
- 分布式(水平扩展&服务拆分)。旨在支持应用程序和服务的开发,可以利用物理架构 由多个自治的处理元素,不共享主内存,但通过网络发送消息合作。(集群:例如厨房多个员工一起炒菜。分布式:例如厨房多个员工,一个洗菜,一个切菜,一个炒菜。)
微服务架构的基础框架/组件
- 服务注册与发现。
- 服务网关(Service Gateway)。
- 后端通用服务(中间层服务:启动时将地址信息注册到服务注册表)。
- 前端服务(边缘服务:查询注册表,发现和调用后端服务;对后端服务进行裁剪(基于不同设备将1个API数据的详细情况进行控制等)和聚合(将多个API进行集合)再暴露给不同的设备)。
微服务架构实现途径
阿里系:Dubbo-服务化治理;Zookeeper-服务注册中心;SpringMVC或SpringBoot。
SpringCloud全家桶:SpringCloud Netflix Eureka;SpringBoot。
SpringCloud概念
是什么:
- SpringCloud是一个开发工具集,包含多个子项目;
- 利用SpringBoot的开发便利,实现了服务注册、服务注册与发现、负载均衡、数据监控、RestAPI发布方式等等;
- 主要是基于对NetFlix开源组件的进一步封装。
作用:简化了分布式开发。
Spring Cloud Eureka
概念:
- 基于Netflix EureKa进行了二次封装。
- 由两个组件组成:Eureka Server 注册中心——供服务注册的服务器;Eureka Client服务注册——简化与服务器的交互,提供服务的故障切换支持。(eureka是一个服务注册中心,并且其本身也是一个服务,需要被注册到自身应用中。)
- 主要功能是 提供 服务的注册 与 发现。
构建Eureka服务注册中心 —— Eureka Server
1. 新建Spring Initializer——>应用名:eureka——>添加依赖:Spring Cloud Discovery—EurekaServer——>项目位置选择:自定义空文件夹\eureka。
2. 在pom.xml中将SpringBoot版本和SpringCloud版本修改成文章开头设定的版本:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.M3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<spring-cloud.version>Finchley.M2</spring-cloud.version>
</properties>
<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>
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服务。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
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)。
总结
- @EnableEurekaServer、@EnableDiscoveryClient两个注解分别注解服务端和客户端的启动类。
- eureka具有心跳检测机制、健康检查机制、负载均衡等功能。
- Eureka的高可用,在生产环境上建议至少两台以上(三台或大于三台,以保证项目的稳定运行)。
- 分布式系统中,服务注册中心是最重要的基础部分。
- Eureka采用的是客户端发现方式。(服务端发现服务:Nginx,Zookeeper,Kubernetes)。
- SpringCloud的服务调用方式:http的Restful风格接口。
微服务特点:由一系列微小的服务共同组成;单独部署,运行在自己的进程中;每个服务为独立的业务开发;分布式管理。(异构——不同编程语言、不同类型的数据库。)
不适合使用微服务框架的业务形态:系统中包含很多强事务的场景;业务相对稳定成熟,迭代周期长;访问压力小,可用性要求不高。
康威定律和微服务:任何组织在设计一套系统(广义概念的系统)时,所交付的设计方案在结构上都与该组织的沟通结构保持一致。简而言之:沟通的问题会影响系统的设计。
其他相关博客以供学习和参考:https://blog.youkuaiyun.com/qq_35275233/article/details/89041647