1.单体应用架构
网址:https://www.jianshu.com/p/a22c68228dc2
2.MicroService(微服务)架构
网址:https://www.jianshu.com/p/0f342a17de03
Spring cloud
网址:https://www.jianshu.com/p/7bd2cbf786be
Spring Cloud 入门
网址:https://www.jianshu.com/p/5c85a1e8b74a
搭建环境
- 新建maven项目springcloud_parent导依赖包
<!--指定版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
<springboot.version>2.0.5.RELEASE</springboot.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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Eureka注册中心
由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。
Eureka是netflix的一个子模块,也是核心模块之一
使用eureka的客户端连接到eureka server并维持心跳连接
三大角色
Eureka server提供服务注册和发现
Service Provider服务提供方
Service Consumer服务消费方新建maven项目springcloud_eureka_7001,导依赖
<dependencies>
<!--springboot支持-->
<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>
</dependency>
<!--Eureka服务端支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
- application.yml配置
server:
port: 7001
#端口
eureka:
instance:
#本机
hostname: localhost
#客户端
client:
registerWithEureka: false #作为一个注册中心不需要注册自己 是否要注册到eureka
fetchRegistry: false #表示是否从Eureka Server获取注册信息
serviceUrl:
#取localhost 取端口
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置
- 搞个类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApp_7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApp_7001.class);
}
}
-
运行-启动入库类访问localhost:7001
自我保护引发的错误
Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。
我们在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制,一旦开启了保护机制,则服务注册中心维护的服务实例就不是那么准确了,此时我们可以使用eureka.server.enable-self-preservation=false来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除(不推荐)。
说白就是:Eureka注册中心 在15钟内,发现你没有心跳(比如网络中断,服务断开呀),就会开启保护机制,可能在这个阶段,如果有消费者访问,就会拿到无效实例,后面可以通过重试或者断路由解决该问题;
注意:Eureka自我保护机制导致,不影响使用.不用管了
建一个公共模块
提供两个字段,tostring,get/set,有参构造,无参构造,都整全了。
public class User {
private Long id;
private String username;
//...省略get/set
}
服务提供者8001
网址:
- 引入jar
<dependencies>
<!--公共代码依赖-->
<dependency>
<groupId>cn.zx</groupId>
<artifactId>user_Interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支持-->
<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>
</dependency>
<!--eureka客户端支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
- application.yml配置
server:
port: 8001
spring:
application:
name: USER-PROVIDER #不要使用下划线
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿
- 启动类cn.zx.springcloud.eureka.UserServerProviderApp_8001
@SpringBootApplication
@EnableEurekaClient
public class UserServerProviderApp_8001 {
public static void main(String[] args) {
SpringApplication.run(UserServerProviderApp_8001.class);
}
}
-
先启动7001,在启动8001,启动起来访问localhost:7001
消费提供9001
Spring Cloud注入中心集群(高可用)
网址:
入门加强-服务消费(负载均衡)#Feign实现
网址:
Hystrix断路器
网址:
Zuul路由网关
网址:
Spring Cloud config配置中心
网址:
分布式事务
事务:Transaction
同一组操作,要么都成功,要么都失败事务特性:ACID
原子性:事务已经是最小单元,不能再去分割
一致性:数据一致,操作之前的总数据和操作完之后总数据都保持一致
隔离性:事务和事务之间相互独立,隔开,你的事务不要操作我的事务
持久性:事务持久化,也就是commit,数据就不能改变
本地事务:同一个库的事务
分布式事务:不同库或者不同的服务
分布式事务
微服务应用就要设计到分布式事务
- docker(容器化部署方案)
- 刚性事务:是指严格遵循ACID原则的事务,
- 柔性事务:是遵循BASE理论的事务,通常用在分布式
CAP
BASE
解决微服务事务