微服务
微服务简介
把一个大型的单个应用程序和服务 拆分为数个甚至数十个的支持微服务,它可扩展单个组件而不 是整个的应用程序堆栈.
微服务(或微服务架构)是一种云原生架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。这些服务通常
1, 有自己的堆栈,包括数据库和数据模型;
2, 通过REST API,事件流和消息代理的组合相互通信;
3,它们是按业务能力组织的,分隔服务的线通常称为有界上下文。
一个经典的微服务框架
微服务优点:
1, 可以更轻松地更新代码。
2, 团队可以为不同的组件使用不同的堆栈。
3, 组件可以彼此独立地进行缩放,从而减少了因必须缩放整个应用程序而产生的浪费和成本,因为单个功能可能面临过多的负载。
Spring中给我们提供了关于微服务的一些框架,之不够有一些不太适合企业的被大厂们进行再次开发,比如注册中心组件
Dubbo(阿里) : 目前开源于Apache ; 2012年推出;2014年停更;2015年恢复更新
DubboX(当当基于Dubbo的更新)
JD-hydra(京东基于Dubbo的更新)
ServiceComb/CSE(华为2017)
SpringCloud (Spring推出) 官网有自己的组件,但是部分没人用
- cloud升级
- 阿里微服务框架
- spring微服务架构与阿里的微服务架构对比
还是先学习spring的框架作为入门
Spring Cloud Netfilx
- 官网概述~
Spring Cloud Netfilx 通过自动配置和绑定到 Spring Environment 和其他 Spring 编程模型习惯用法,为 Spring Boot 应用程序提供 Netflix OSS 集成。 通过一些简单的注释,您可以快速启用和配置应用程序中的常见模式,并使用经过实战考验的 Netflix 组件构建大型分布式系统。 提供的模式包括服务发现 (Eureka)、断路器 (Hystrix)、智能路由 (Zuul) 和客户端负载平衡 (Ribbon)。
- Spring Cloud Netflix 功能
服务发现:可以注册 Eureka 实例,客户端可以使用 Spring 管理的 bean 发现实例;
服务发现:可以使用声明性 Java 配置创建嵌入式 Eureka 服务器
断路器:可以使用简单的注释驱动方法装饰器构建 Hystrix 客户端
断路器:具有声明性 Java 配置的嵌入式 Hystrix 仪表板
声明式 REST 客户端:Feign 创建用 JAX-RS 或 Spring MVC 注释装饰的接口的动态实现
客户端负载均衡器:功能区
外部配置:从 Spring 环境到 Archaius 的桥梁(使用 Spring Boot 约定启用 Netflix 组件的本地配置)
路由器和过滤器:自动注册 Zuul 过滤器,以及一种简单的约定优于配置的方法来创建反向代理
- Spring Cloud Netflix 的组件
1,Eureka
服务注册和发现,它提供了一个服务注册中心、服务发现的客户端,还有一个方便的查看所有注 册的服务的界面。 所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。
2,Ribbon
负载均衡,一个请求发送给某一个服务的应用的时候,如果一个服务启动了多个实例,就会通过 Ribbon来通过一定的负载均衡策略来发送给某一个服务实例。
3,Feign
服务客户端,服务之间如果需要相互访问,可以使用RestTemplate,也可以使用Feign客户端访 问。它默认会使用Ribbon来实现负载均衡。现在终止维护,使用openFeign或者直接使用阿里的框架
4,Hystrix
监控和熔断器 我们只需要在服务接口上添加Hystrix标签,就可以实现对这个接口的监控和断路 器功能。
Hystrix Dashboard,监控面板,他提供了一个界面,可以监控各个服务上的服务调用所消耗的时间等。
Turbine,监控聚合,使用Hystrix监控,我们需要打开每一个服务实例的监控信息来查看。
5,Zuul
网关,所有的客户端请求通过这个网关访问后台的服务。他可以使用一定的路由配置来判断某一个URL由哪个服务来处理。并从Eureka获取注册的服务来转发请求。
微服务入门
版本的选择
SpringCloud版本和Springboot版本兼容 不同的springboot版本,配套支持SpringCloud的版本;如果使用Hoxton版本,Boot版本必须要2.2.x或者以上.
这里给出一个参考~
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.6</spring-boot.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
</properties>
微服务项目框架
-
新建项目microService
-
新建父类模块~dependencies
依赖限制版本,以使得开发时版本一致
pom方式;项目总依赖包;通用的依赖版本;总体父项目
<parent>
<artifactId>wfwservice</artifactId>
<groupId>com.gavin</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<artifactId>dependency</artifactId>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
</dependencies>
</dependencyManagement>
这里为什么要建立父类模块而不是直接用microService,
这是因为单继承的限制,这里使用的是一台电脑,所以将各个模块集中到一个总的框架中,Eureka模块需要单独拿出来作为一个注册中心,父类pom为springbootparent;
- Common模块
jar包方式;项目公共包;包含通用实体类,工具类,结果码等.
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 公共的实体类,用于服务与服务之间传递数据用的
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderInfo implements Serializable {
private int oid;
private String number;
private static final long serialVersionUID = -1L;
}
- Eureka模块
搭建springboot项目
服务发现是基于微服务架构的关键原则之一
Eureka 是 Netflix 服务发现服务器和客户端。 可以将服务器配置和部署为高度可用的,每个服务器都将有关已注册服务的状态复制给其他服务器。
依赖~
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eurekaservice</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>3.1.1</version