什么是微服务?
微服务是一种架构风格,它要求我们在开发一个应用的时候,这个应用必须构建成一系列小服务的组合。可以通过http的方式进行互通。要说微服务架构,先得说说过去我们的单体应用架构。
单体应用架构
所谓单体应用架构(all in one)是指,我们将一个应用的中的所有应用服务都封装在一个应用中。无论是ERP、CRM或是其他什么系统,你都把数据库访问,web访问,等等各个功能放到一个war包内。这样做的好处是,易于开发和测试;也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了。
单体应用架构的缺点是,哪怕我要修改一个非常小的地方,我都需要停掉整个服务,重新打包、部署这个应用war包。特别是对于一个大型应用,我们不可能把所有内容都放在一个应用里面,我们如何维护、如何分工合作都是问题。
单体架构图:
例如:
单体架构存在的缺点:
复杂性逐渐变高
技术债务逐渐上升
部署速度逐渐变慢
阻碍技术创新
无法按需伸缩
微服务架构
所谓微服务架构,就是打破之前all in one的架构方式,把每个功能元素独立出来。把独立出来的功能元素的动态组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元素进行复制,而没有对整个应用进行复制。
这样做的好处:
节省了调用资源。
每个功能元素的服务都是一个可替换的、可独立升级的软件代码。
例如:
微服务具备的特性:
每个微服务可独立运行在自己的进程里
一系列独立运行的微服务共同构建起了整个系统
每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理、用户管理等
微服务之间通过一些轻量的通信机制进行通信,例如通过REST API或者RPC的方式进行调用
Spring Cloud简介
Spring Cloud事实上是一整套基于Spring Boot的分布式微服务架构下的一站式解决方案。它为开发者提供了很多组件,用于快速构建分布式系统的一些通用模式,例如:配置管理、注册中心、服务发现、限流、网关、链路追踪等。
微服务是可以独立部署、水平扩展、独立访问(或者有独立的数据库)的服务单元, Spring Cloud就是这些微服务的大管家,采用了微服务这种架构之后,项目的数量会非常多, Spring Cloud做为大管家就需要提供各种方案来维护整个生态。
Springcloud中文网:https://www.springcloud.cc/
SpringCloud与SpringBoot关系
SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、精选决策、分布式会话等集成服务。
Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的云应用开发工具。
Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置。
Spring Cloud很大的一部分是基于Spring Boot来实现,SpringBoot在SpringClound中起到了承上启下的作用,如果你要学习SpringCloud必须要学习SpringBoot。
学习Spring Cloud的条件
你必须掌握以下内容:
Spring框架的使用经验
熟练使用Maven进行项目构建和依赖管理
熟练使用IDEA或者Eclipse
熟练使用Spring Boot
环境准备:
Jdk 1.8
maven3.6.3
IntelliJ IDEA 2020
Spring Boot 2.3.6RELEASE
Spring Cloud Hoxton SR9
版本参考spring官网:https://spring.io/
Consul-微服务注册中心
常见的注册中心
1.Zookeeper
2.Eureka
3.consul
4.nacos
什么是Consul
Consul官网:https://www.consul.io/
中文API: https://www.springcloud.cc/spring-cloud-consul.html
Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。
Consul能干什么
Consul 安装
安装教程:
- 从官网下载consul,并解压 官网网址:https://www.consul.io/
- cmd进入到命令行界面,输入consul指令,敲击回车安装consul
解压目录:
cmd安装命令:
安装成功后会有如下指令提示
- Consul的启动,输入consul agent -dev指令,敲击回车启动consul
启动Consul服务,使用以下命令:
consul agent -server -ui -bootstrap -client 0.0.0.0 -data-dir=“d:\consul\data” -bind 127.0.0.1
-bind: 将consul绑定到服务器的ip上,默认是0.0.0.0,如果服务器有多张网卡的时候需要手动指定。调bind的ip必须是所有consul集群成员都可以访问的
-data-dir: 用来存储consul保存的注册信息,这个参数是必须指定的
-ui:开启ui页面
-client:这个参数可以指定server拥有client的功能,可以接受服务注册
-join:用来加入其它的consul集群
-node:用来指定服务的名称,改建点默认为d1当需要使用集群部署的时候需要对每个服务指定不同的名称
也可以使用开发模式(更加简单,自动开启UI服务,但是不能保存数据状态)
consul agent -dev
ConsulAgent是Consul的核心进程,Agent的工作是维护成员关系信息、注册服务、健康检查、响应查询等等。Consul集群的每一个节点都必须运行agent进程。
Agent有两种模式:client或server:
Server要参与consensus quorum,当遇到故障情况时,这些节点通过Raft提供强一致性和强有效性,在Server节点上的较高负载意味着它们应该运行在专属的实例——它们比客户端节点更为资源密集型。在整个集群中,绝大部分都为Client节点。
client把所有的RPCs转发到server端,是相对无状态的。唯一在后台运行的时client端执行了LAN gossip pool,只消耗极少的资源和网络带宽。
- 启动后输入地址:http://localhost:8500,查看consul控制界面
- 配置consul环境变量. 成功后可直接在命令提示符面板中输入consul命令
Consul集群搭建: https://www.jianshu.com/p/87f03c025281
Consul流程图
实战演示案例
服务:1、注册中心服务端(服务注册中心) 2、商品服务(服务提供者) 3、订单服务(服务消费者)
需求:订单服务需要查询商品信息完成下单服务,商品服务
提供商品查询的接口并且注册到服务中心,订单服务通过服务中心调用商品服务,从而拿到商品信息。
实现步骤:
- 启动consul注册中心
- 搭建微服务聚合父工程Project
2.1 创建maven项目,项目名称:microservices-cloud
创建成功后,删除src目录,结构如下
2.2 打开pom.xml进行配置springboot+springcloud的版本
添加对应的坐标
org.springframework.boot
spring-boot-dependencies
2.3.6.RELEASE
pom
import
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR9
pom
import
org.springframework.boot spring-boot-devtools runtime
org.projectlombok lombok
org.springframework.boot spring-boot-starter-test test
org.springframework.boot spring-boot-maven-plugin true
3. 搭建公共子模块 (包含所有子模块公共的部分,达到通用)
3.1 创建maven的子模块,项目名称:cloud-api3.2 编写商品的实体类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Goods {
private String id;
private String name;
private double price;
private String serverPort; //服务端口
}4. 搭建服务提供者子模块 (商品服务模块)
4.1 创建maven的子模块,项目名称:cloud-provider-goods-80014.2 打开pom.xml文件,添加依赖
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-consul-discovery
org.springframework.boot
spring-boot-starter-actuator
com.bdqn
cloud-api
1.0-SNAPSHOT
4.3 创建application.yml的全局配置文件
#商品服务提供者的服务端口
server:
port: 8001spring:
application:
###应用程序服务名称
name: cloud-provider-goods
cloud:
###开始配置consul的服务注册
consul:
#consul服务器的主机地址
host: localhost
#consul服务器的ip地址
port: 8500
discovery:
#服务主机名称
#hostname: 127.0.0.1
#服务的名称
service-name: KaTeX parse error: Expected 'EOF', got '#' at position 35: ….name} #̲是否需要注册 …{server.port}")
private String serverPort;@RequestMapping("/getGoods")
public Goods getGoods(String id){
Goods goods=new Goods("1001","苹果",9.9,serverPort);
return goods;
}}
4.5 创建启动类
@SpringBootApplication
@EnableDiscoveryClient //开启注册中心发现,让注册中心发现并扫描到该服务
public class GoodsApp8001 {
public static void main(String[] args) {
SpringApplication.run(GoodsApp8001.class,args);
}
}
4.6启动项目,并去Consul界面控制台测试服务提供者是否已经注册进去5.搭建服务消费者子模块 (订单服务模块)
5.1 创建maven子模块,项目名称:cloud-consumer-order-90015.2 打开pom.xml文件,添加依赖
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-consul-discovery
org.springframework.boot
spring-boot-starter-actuator
com.bdqn
cloud-api
1.0-SNAPSHOT
5.3 创建application.yml配置文件
server:
port: 9001spring:
application:
name: cloud-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
hostname: 127.0.0.1
service-name: ${spring.application.name}
register: true5.4 编写模拟下订单的业务,演示服务与服务之间的调用
订单服务需要通过前端传来的商品ID,调用商品的服务从而获取商品的信息
@RestController
@RequestMapping(“/order”)
public class OrderController {
static final String PRE_URL=“http://127.0.0.1:8001”;@GetMapping("/downOrder/{id}")
public String downOrder(@PathVariable String id){
//向商品的服务发送请求,获取指定的商品信息
/*
RestTemplate是spring提供的可以提供访问rest服务的客户端工具类,
提供多种快捷的访问远程的方法,大大提高了客户端的编程效率。
*/
RestTemplate restTemplate=new RestTemplate();
String result=restTemplate.getForObject(PRE_URL+"/goods/getGoods?id="+id,String.class);
return "下订单成功,购买的书籍信息为:"+result;
}}
5.5 创建启动类
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApp9001 {
public static void main(String[] args) {
SpringApplication.run(OrderApp9001.class,args);
}
}
5.6启动项目,查看运行结果
注意:1.启动consul注册中心 2.启动服务提供者 3.启动服务消费者
Consul注册中心: