微服务架构简介、consul[微服务注册中心]

微服务架构简介、consul[微服务注册中心]
什么是微服务?
微服务是一种架构风格,它要求我们在开发一个应用的时候,这个应用必须构建成一系列小服务的组合。可以通过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 安装
安装教程:
https://blog.csdn.net/qq_33391499/article/details/106785843

  1. 从官网下载consul,并解压 官网网址:https://www.consul.io/

  2. cmd进入到命令行界面,输入consul指令,敲击回车安装consul
    解压目录:

cmd安装命令:
安装成功后会有如下指令提示

  1. 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,只消耗极少的资源和网络带宽。

  1. 启动后输入地址:http://localhost:8500,查看consul控制界面

  2. 配置consul环境变量. 成功后可直接在命令提示符面板中输入consul命令

Consul集群搭建: https://www.jianshu.com/p/87f03c025281

Consul流程图

实战演示案例
服务:1、注册中心服务端(服务注册中心)  2、商品服务(服务提供者)  3、订单服务(服务消费者)
需求:订单服务需要查询商品信息完成下单服务,商品服务
提供商品查询的接口并且注册到服务中心,订单服务通过服务中心调用商品服务,从而拿到商品信息。
实现步骤:

  1. 启动consul注册中心

  2. 搭建微服务聚合父工程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
  1. 搭建公共子模块 (包含所有子模块公共的部分,达到通用)
    3.1 创建maven的子模块,项目名称:cloud-api

3.2 编写商品的实体类
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Goods {
private String id;
private String name;
private double price;
private String serverPort; //服务端口
}

  1. 搭建服务提供者子模块 (商品服务模块)
    4.1 创建maven的子模块,项目名称:cloud-provider-goods-8001

4.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: 8001

spring:
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-9001

5.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: 9001

spring:
application:
name: cloud-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
hostname: 127.0.0.1
service-name: ${spring.application.name}
register: true

5.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注册中心:

订单服务调用商品的服务:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值