微服务架构发展史
单体架构
业务垂直划分
集群-负载均衡
SOA架构
微服务架构时代
(1)微服务架构就是开发的一个独立的系统,只不过这个独立系统通过一系列小的服务组成
(2)每个服务都会是一个独立的进程
(3)每个服务之间要进行调用,并且调用的方式是轻量级的通信机制,比如像Http协议
(4)这些服务通常会采用自动化的运维机制: CICD Continuous Intergration Continuous Delivery DevOps
(5)这些服务是去中心化的
(6)这些服务可以使用不同的编程语言来完成
(7)可以采用不同的数据存储技术
单体架构和微服务架构的比较
单体架构
优势:所有功能代码都是部署在一个war包,方便部署与测试
劣势:
(1)开发效率
(2)代码维护难
(3)扩展性也比较低
(4)如果挂了,就会没办法给用户提供功能
微服务架构
优势:
独立性、技术栈比较灵活、数据库的选择比较灵活、团队高效等
劣势:
额外一些工作[DDD领域驱动设计]、数据一致性
微服务架构需要解决的问题
(1)服务调用
(2)负载均衡
(3)服务调用失败,容错机制:立即返回?等待?过一会时间再访问?
(4)网关
(5)事务
(6) ……
左边是SpringCloud团队做了接口以及实现类,右边是不同的厂商对于规范做了对应的实现。
服务的注册与发现
配置统一的版本管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.9.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-dependencies</artifactId>
<version>2.2.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
基于SpringCloud Netflix Eureka作为注册中心
基于Nacos进行服务的注册与发现
1、引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
2、配置Nacos注册中心
spring:
cloud:
nacos:
discovery:
#指定nacos-server所在的地址
server-addr: localhost:8848
application:
name: order-service
3、启动子服务即可在日志以及Nacos控制台看到已经成功注册服务
4、使用Ribbon做负载均衡
@Resource
private LoadBalancerClient loadBalancerclient;
注解的方式使用Ribbon的负载均衡
@Bean
@LoadBalanced //表示该RestTemplate就具备了ribbon能力
public RestTemplate restTemplateRibbon(){
return new RestTemplate();
}
基于Zookeeper作为服务的注册中心
服务调用组件之OpenFeign
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
主类添加注解
@EnableFeignClients
定义服务中远程调用的接口
import org.springframework.cloud.openfeign.Feignclient;
import org.springframework.web.bind.annotation.RequestMapping;
@Feignclient(name = "order-service")
public interface OrderServiceFeignclient{
RequestMapping("/order/query")
string query();
}
在业务类中进行依赖注入即可使用
定义一些Feign的配置
通过JavaConfig
通过yaml文件配置
# feign的日志级别FULL
feign:
client:
config:
#feign调用的服务名称
order-service:
loggerLevel: full
logging:
level:
com.fcant.userservice.openfeign: debug
配置中心
Nacos作为配置中心
1、引入Nacos Config包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-config</artifactId>
</dependency>
<!--使bootstrap.yaml文件生效-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
2、在Nacos Web端添加配置文件
创建一个名称为user-service-dev.yaml的配置文件
person:
username: Fcant
3、在服务中配置选择对应的配置文件
创建bootstrap.yaml文件,添加主要的配置内容
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
application:
#对应user-service-dev.yaml中的user-service
name : user-service
#配置激活的环境,即文件名后缀-dev
profiles:
active: dev
4、在对应读取配置文件的Bean上面添加@RefreshScope
注解
@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {
@Value("${person.username}")
private String personUsername;
@RequestMapping("/readnacosconfig")
public String readNacosConfig(){
return this.personUsername;
}
}
Spring Cloud Config作为配置中心
服务保护
- 限流
- 降级
SpringCloud Alibaba Sentinel
1、导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel</artifactId>
</dependency>
2、配置
spring:
cloud :
nacos:
discovery:
server-addr: localhost:8848
sentinel:
transport:
#配置sentinel-server所在的地址
dashboard: localhost:8080
3、服务的接口以及监控管理
:::tips 注意:服务启动成功后,并不能看到对应的服务名,因为Sentinel是懒加载的,所以只有通过访问的请求,才能在Web端查看到。 :::SpringCloud Netflix Hystrix
消息中间件的整合
Kafka
Pulsar
ActiveMQ
RocketMQ
官网:https://rocketmq.apache.org/1、RocketMQ安装部署启动
Window上需要先添加RocketMQ安装包的环境变量start mqnamesrv.cmd
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnab1e=true
2、RocketMQ Web管理控制台
https://github.com/apache/rocketmq-dashboard
如果启动端口冲突则需要修改配置3、服务中整合RocketMQ的依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
4、配置broker以及服务对应的producer
# rocket-server的配置
rocketmq:
name-server: 127.0.0.1:9876
producer:
group: fcant-producer
5、生产消息示例
```java @Resource RocketMQTemplate rocketMQTemplate;
@RequestMapping(“/produce”) public void produce() { rocketMQTemplate.convertAndSend(“user-service-topic”, “Hello World”); }
<a name="DDDQi"></a>
#### 6、消费者服务配置RocketMQ Server
```yaml
# rocket-server的配置
rocketmq:
name-server: 127.0.0.1:9876
7、消费者消费消息
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;
/**
* ConsumerListener
* <p>
* encoding:UTF-8
*
* @author Fcant 上午 10:41 2021/9/5/0005
*/
@Service
@RocketMQMessageListener(consumerGroup = "fcant-consumer",topic = "user-service-topic")
public class ConsumerListener implements RocketMQListener<String> {
@Override
public void onMessage(String s) {
System.out.println("Get Message: " + s);
}
}
微服务网关
SpringCloud Netflix Zuul第一代网关
Zuul网关采取的是BIO(同步阻塞IO),new ServerSocket(8090);
SpringCloud GateWay第二代网关
GateWay采取的是NIO(同步非阻塞IO),new ServerSocketChannel(8090);
,GateWay更适合高并发的场景。
网关可以做的事:
- 服务的发现以及自定义
- 熔断
- 负载均衡
- 限流
- 认证授权
1、创建GateWay网关模块
2、引入GateWay依赖(这里的注册中心还是Nacos)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
3、配置yaml
server:
port: 8090
spring:
cloud :
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
# 开启网关服务发现能力
locator:
enabled: true
application:
name: my-gateway
4、自定义配置路由规则
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
#开启网关服务发现的能力
enabled: true
#自定义的路由规则
routes:
#路由匹配的条件
- predicates:
- Path=/fcant/**
filters:
#表示过滤器进行操作
- StripPrefix=1
uri: http://localhost:8081
链路追踪
把微服务的调用关系记录下来,方便后期问题排查。SpringCloud Sleuth(可视化界面使用zipkin)
默认的采样率为10%,即调用十次,记录一次。1、引入依赖
在需要进行链路追踪的模块里面引入依赖,zipkin已经包含了sleuth的依赖<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
2、服务模块配置zipkin
这里设置采用率为百分之百,方便进行观察。默认0.1。spring:
zipkin:
base-url: http:localhost:9411
sleuth:
sampler:
probability: 1.0
SkyWalking(用的比较多)
阿里鹰眼
大众点评Cat
分布式事务
SEATA