IT自学第四十一天(微服务)

微服务


1、微服务课程安排

分布式及微服务框架:SpringCloud、Dubbo

分布式中间件:Rubit

微服务是一种软件架构风格,他是以专注于单一职责的很多小型项目为基础,组合出复杂的大型应用。

服务拆分、远程调用、服务治理、请求路由。商品与订单之间的交互,利用远程服务调用。

身份认证,配置管理,服务保护,分布式事务(跨系统事务问题,回滚问题,原子性失败),异步通信,消息可靠性,延迟消息,分布式搜索(几百万条数据以上),倒排索引,数据聚合。

将用户信息作为10台服务器,而订单用200台服务器。

2、单体架构

单体架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

优点:架构简单,部署成本低。

缺点:团队协作成本高;系统发布效率低;系统可用性差(一个tomcat来承担压力)。

分成多个tomcat来分担压力。

总结:单体架构比较简单,适合规模比较小的项目。

3、微服务简介

微服务架构,是服务化思想指导下的一套最佳实践架构方案。服务化,就是把单体架构中的功能模块拆分为多个独立项目。

粒度小,团队自治,服务自治。

数据库也是分离的。

4、SpringCloud微服务框架简介

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验:

对于SpringBoot的版本也有要求:

上课使用的是2021

5、黑马商城项目了解

熟悉黑马商城

6、服务拆分原则

服务拆分原则

什么时候拆分?

7、拆分服务-商品微服务

拆分服务

工程结构有两种:

独立Project(非常大型,彻底独立)、Maven聚合(中大型)。

需求:

8、拆分服务-购物车微服务

拆分购物车代码,里面会需要涉及到一些商品的信息,需要关联商品表。里面的信息是空的。

9、服务远程调用

远程调用

RestTemplate实现HTTP请求

java 复制代码
List<ItemDTO> items = null;
String url = "http://localhost:8081/items?ids={ids}";
ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(url,   //请求地址
        HttpMethod.GET,   //请求方式
        null,    //请求参数实体,因为在路径中携带参数,因此不需要
        new ParameterizedTypeReference<List<ItemDTO>>() {
        }, //返回数据类型
        Map.of("ids", CollUtils.join(itemIds, ","))   //将集合中的元素用","号分割
);

10、注册中心原理

服务治理

服务远程调用时存在的问题:写死不方便。

注册中心原理:

11、nacos安装

Nacos可以当注册中心,也可以是配置中心。

nacos基于数据库存储。

nacos在Docker部署。

12、服务注册

服务注册

服务注册步骤如下:

13、服务发现

服务发现

消费者需要连接nacos以拉取和订阅服务,因此服务发现的前两步和服务注册是一样的,后面再加上服务调用即可:

java 复制代码
//获取注册中心中item-service的服务列表
List<ServiceInstance> instanceList = discoveryClient.getInstances("item.service");
//从上面随机选择一个服务实例
ServiceInstance serviceInstance = instanceList.get(RandomUtil.randomInt(instanceList.size()));
//可以从实例中获取微服务的访问地址
String url = serviceInstance+"/items?ids={ids}";

现在还是通过HTTP访问,一个一个的访问。要是可以把全部的类和方法共享出去。就可以相当于在一个项目里进行调用。

14、Feign快速入门

SOA 面向服务的架构---->分布式系统 ----->粒度更细,职责更单一;微服务

微服务更加偏向于功能职责的拆分,分布式更加偏向于服务器,物理机,地域的分布。

OpenFeign

快速入门

OpenFeign已经被SpringCloud自动装配,实现起来。

15、Feign-配置连接池

连接池

OpenFeign对Http请求做了优雅的伪装,不过其底层发起http请求,依赖于其它的框架。这些框架可以自己选择,包括以下三种:

  • HttpURLConnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

具体源码可以参考FeignBlockingLoadBalancerClient类中的delegate成员变量。

OpenFeign整合OKHttp的步骤如下:

引入依赖:

XML 复制代码
<!--        OK http 的依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-okhttp</artifactId>
        </dependency>

开启连接池功能

16、Feign-抽取客户端最佳实践

最佳实践-抽取hm-api

实现步骤:

最佳实践抽取:将微服务需要的客户端抽取出来,每个模板调用抽取出的客户端。

17、Feign-日志级别配置

日志

相关推荐
国科安芯44 分钟前
人在回路中的总线:商业空间站环境控制与生命保障系统CANFD网络的可靠性与功能安全
网络·嵌入式硬件·安全·架构·php·抗辐射
一条Go1 小时前
告警指纹:一次故障为什么只产生一条 FIRING 记录
后端·架构·github
王中阳Go1 小时前
你把重试加到 2 次那天,200 条里成功还是 181 条,你回看过吗?
人工智能·后端·架构
Zan1 小时前
Tauri 2 实战:为什么一个可靠的桌面应用,应该由 Rust Host 管理生命周期?
前端·架构·rust
神鹰手哥_起飞版1 小时前
我是怎么管理 Coding Agent 的:把任务交出去,也把结果验回来
人工智能·架构·产品经理
阿里云云原生2 小时前
稳定复现超 70% 的缺陷,报警到自动修复的 Agent 流水线实践
云原生
阿里云云原生3 小时前
从“自证清白”到“因果链条”:智能体如何重塑运维排障效率
云原生
阿里云云原生4 小时前
TechTalk丨从能买奶茶到能进企业,Agent 绕不开同一组问题
云原生·agent
逐流人5 小时前
手工建集群到全自动发布:k8s集群部署与DevOps流水线整合实战
ci/cd·云原生·kubernetes·云计算·devops
我不会起名字3225 小时前
K8s Pod 反复重启 CrashLoopBackOff:从 exit code 到根因的 5 步排查
云原生·容器·kubernetes·k8s