微服务框架saf-5:saf-http与demo的解析与体验,以及容器化部署
toqiye 2024-11-27 21:08 8 浏览 0 评论
相关文章
微服务框架saf-3:saf-dubbo与demo的解析与体验与容器化部署
阿里云&kubernetes&微服务生产实践-2:apollo架构-1
kubernetes-1:使用kubeadm搭建K8S单master节点集群
目录
(1).关于saf
(2).saf-http与demo的简单解析
1.saf-http特性
1.1本地0配置特性
1.2.度量特性
1.3.熔断与限流特性
2.saf-http-demo简述
2.1.使用简述
2.2.demo工程结构
(3).本地体验saf-http
1.本地环境准备
1.1.docker-compose启动apollo
1.2.打通本地宿主机与docker服务的网络
2.本地体验saf-http
(4).容器化部署环境准备
1.硬件要求
2.K8S单节点集群搭建
3.容器化相关基础组件
3.1.基础中间件容器化准备
3.2.apollo容器化部署
3.3.ingress容器化
3.4.配置相关的ingress代理
(5).编译saf与saf-sample-http
1.工程下载与编译顺序
2.编译saf
3.编译saf-sample-http
(6).进行apollo配置
(7).容器化部署
1.制作saf-sample-http-apache-httpcomponents-web-receive镜像
2.容器化saf-sample-http-apache-httpcomponents-web-receive
(8).容器化部署saf-sample-http-apache-httpcomponents-web-send
1.制作saf-sample-http-apache-httpcomponents-web-send镜像
2.容器化saf-sample-http-apache-httpcomponents-web-send
(9).验证服务
1.验证spring boot actuator组件
2.验证业务接口
3.度量验证
(10).特别注意
(11).相关文章
(1).关于saf
项目地址:
https://github.com/saf-group
1.一个微服务框架,完全基于注解的方式开发。
2.适用于云原生(K8S)下的微服务体系搭建,为技术中台提供底层支撑。
3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。
(2).saf-http与demo的简单解析
1.saf-http特性
1.1本地0配置特性
saf框架的一个最大特点是是本地0配置,所有配置都在分布式配置中心。
我们希望的是在远端分布式配置中心配置好,http服务在启动时将远端配置拉下来注入对应的bean,完全做到本地0配置,将配置与代码完全隔离,有利于后期的各种热更新,为容器化/serverless做好基础准备。
saf-http完成的就是这样一件事,工程地址:
https://github.com/saf-group/saf/tree/master/saf-http
主要代码位于:
https://github.com/saf-group/saf/blob/master/saf-http/saf-http-apache-httpcomponents/src/main/java/com/future/saf/http/apache/httpcomponents/syncimpl/HttpBioClientFactoryBean.java
注入代码主要为:
@Override
public HttpBioClient getObject() {
String instance = HttpBioClientRegistrar.instanceMap.get(beanName);
String project = HttpBioClientRegistrar.projectMap.get(beanName);
HttpBioClientProps props = new HttpBioClientProps();
Bindable<?> target = Bindable.of(HttpBioClientProps.class).withExistingValue(props);
binder.bind(project + "." + getPreFix() + "." + instance + ".props", target);
HttpBioClient cHttpBioClient = new HttpBioClient(instance.replace("-", "_"), props);
return cHttpBioClient;
}
注意这里:
binder.bind(project + "." + getPreFix() + "." + instance + ".props", target);
project代表当前工程的jvm,instance代表这个jvm里的某个http线程池,这样才可以在资源隔离后做到灵活配置。
1.2.度量特性
目前支持APM,QPS,Lantency。
APM度量使用spring-boot-starter-actuator。
QPS与Lantency使用httpFilter(对应http-in的度量与统计)和httpBioClient(对应http-out的度量与统计)。
例:
关于度量后续会单独开一篇文章陈述,要度量的内容还有很多,比如blockingQueue的空闲数,sentinel的频次控制的度量等。
1.3.熔断与限流特性
主要是两个机制保证:
一个是通过blockingQueue中的任务数阈值控制,如当blockingQueue中的任务数超过指定阈值,则reject掉所有信的http请求发起,防止冲塌当前JVM以及要访问的远端服务(或者http网关如果有的话);
还有一个是通过sentinel进行控制,也是为了防止冲塌当前JVM以及要访问的远端服务(或者http网关如果有的话);
关于熔断与限流特性,后续单开文章陈述。
2.saf-http-demo简述
2.1.使用简述
saf-http-demo-service,@EnableHttpBioClient
主要是定义httpService的apollo配置的前缀部分,达到注入。
2.2.demo工程结构
saf-http-demo包含两个工程,saf-http-web-receive和saf-http-web-send,其拓扑关系如下:
(3).本地体验saf-http
1.本地环境准备
为了方便,笔者在本地mac上也装了docker,通过docker后台运行相关的apollo配置中心和zookeeper。
1.1.docker-compose启动apollo
git clone https://github.com/ctripcorp/apollo.git
cd apollo/scripts/docker-quick-start
执行命令:docker-compose up -d
注意第一次启动由于要下载相关镜像会很慢。-d表示谁后台运行。
docker exec -it apollo-quick-start /bin/bash
访问url并输入用户名密码:apollo/admin
http://localhost:8070/signin
验证config,访问url:http://localhost:8080/
1.2.打通本地宿主机与docker服务的网络
默认情况下,docker服务与本地宿主机不在一个网段,直接使用是有问题的,需要将两者网络打通,笔者使用的是vpn的方式,具体步骤参加文章:
2.本地体验saf-http
笔者提供了一个简单demo:saf-sample-http-apache-httpcomponents。
首先我们要编译saf框架代码:
git clone https://github.com/saf-group/saf.git
cd saf
mvn clean package install -Dmaven.test.skip=true
下载saf-sample-http-apache-httpcomponents:
git clone https://github.com/saf-group/saf-sample.git
cd saf-sample/saf-sample-http/saf-sample-http-apache-httpcomponents
saf-sample-http-apache-httpcomponents是一个简单的http与apollo集成的demo,方便我们观察本地0配置的特性。
修改saf-sample-http-apache-httpcomponents-web-receive
,saf-sample-http-apache-httpcomponents-web-send下的apollo-env.properties文件,将dev.meta的值改为http://apollo-docker-ip:8080。
在本地apollo完成配置,配置内容位于github:
https://github.com/saf-group/saf-sample/blob/master/saf-sample-http/saf-sample-http-apache-httpcomponents/apollo-config/apollo-config.local.txt
将工程saf-sample-http-apache-httpcomponents导入eclipse,service和web各自增加启动参数后启动:
-Denv=dev -Dapp.id=demo-http-receive
-Denv=dev -Dapp.id=demo-http-send
浏览器访问与验证:
http://localhost:8081/shop/getShop?shopId=1333
(4).容器化部署环境准备
1.硬件要求
理想配置是8core,32GB。
2.K8S单节点集群搭建
kubernetes-1:使用kubeadm搭建K8S单master节点集群
3.容器化相关基础组件
3.1.基础中间件容器化准备
由于PV适用的是local PV,所以先初始化本地pv目录,执行local pv目录初始化脚本:
https://github.com/hepyu/k8s-app-config/blob/master/yaml/init.sh
3.2.apollo容器化部署
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/apollo-min
注意:使用容器化方式部署基础组件主要是为了快速构建allinone-demo的运行环境,实际生产中是需要权衡的,比如mysql不要放K8S里,而且上述基础组件的容器化都是最小资源防止超过硬件容量,比如rocketmq只有一组master/slave。
3.3.ingress容器化
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/ingress-nginx-min
3.4.配置相关的ingress代理
https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/ingress-nginx-min/proxy
kubectl apply -f分别执行:
ingress-nginx-apollo-config.yaml
ingress-nginx-apollo-portal.yaml
(5).编译saf与saf-sample-http
1.工程下载与编译顺序
git clone https://github.com/saf-group/saf.git
git clone https://github.com/saf-group/saf-sample.git
他们的依赖关系是:
saf-sample依赖saf。
所以编译顺序是:saf -> saf-sample。
2.编译saf
本例使用的是master:
mvn clean package install -Dmaven.test.skip=true
- 编译saf-sample-http
cd saf-sample
mvn clean package install -Dmaven.test.skip=true
(6).进行apollo配置
进入目录:
saf-sample/saf-sample-http/saf-sample-http-apache-httpcomponents/apollo-config
将apollo-config目录中的apollo-config.k8s.txt配置文件配置到apollo配置中心。
关于apollo配置如何规划,可以先参照文章:
阿里云&kubernetes&微服务生产实践-2:apollo架构-1
里边有一张图描述了自定义规约。
(7).容器化部署saf-sample-http-apache-httpcomponents-web-receive
1.制作saf-sample-http-apache-httpcomponents-web-receive镜像
在工程目录下执行脚本docker.build.sh 制作docker镜像:
sh docker.build.sh
如果失败检查下docker.build.sh和Dockerfile中的demo版本。
2.容器化saf-sample-http-apache-httpcomponents-web-receive
进入工程目录下的kubernetes目录直接执行脚本deploy.sh,会顺次执行上述yaml文件,执行kubectl get pod -n inc查看Pod,
(8).容器化部署saf-sample-http-apache-httpcomponents-web-send
过程类似,这里简单描述。
进入工程目录:
1.制作saf-sample-http-apache-httpcomponents-web-send镜像
在目录下执行脚本docker.build.sh 制作docker镜像:
sh docker.build.sh
2.容器化saf-sample-http-apache-httpcomponents-web-send
进入目录下的kubernetes直接执行脚本deploy.sh。
这里有一个文件会把这个web服务挂到ingress上,从而将服务暴露到容器外部,供公网访问:
saf-sample-http-apache-httpcomponents-web-send-prod-ingress.yaml
(9).验证服务
我们先查看saf-sample-http-apache-httpcomponents-web-send的ingress域名:
[root@future ~]# kubectl get ingress -n inc | grep -i saf-sample-http
saf-sample-http-apache-httpcomponents-web-send-prod saf-sample-http-apache-httpcomponents-web-send.future.com 39.98.43.48 80 19h
配置host:
ip1 saf-sample-http-apache-httpcomponents-web-send.future.com
1.验证spring boot actuator组件
浏览器访问:
http://saf-sample-http-apache-httpcomponents-web-send.future.com:30834/actuator/health
返回:
{"status":"UP","details":{"diskSpace":{"status":"UP","details":{"total":105552769024,"free":54718111744,"threshold":10485760}}}}
2.验证业务接口
http://saf-sample-http-apache-httpcomponents-web-send.future.com:30834/shop/getShop?shopId=335566
可以看到返回一个很长的字符串。
3.度量验证
查看web-receive和web-send的9145端口的metrics:
(10).特别注意
如果足够细心,会发现又一个/favicon.ico的url,这个是因为通过浏览器访问时,会自动下载favicon.ico:
移动段应用应该把浏览器的这个功能禁用,否则在http的同步调用场景下会损失50%的TPS,应为这个请求同样会穿透到springboot,下debug断点后你可以看到Filter会拦截到这个favicon.ico请求:
不要小瞧这个地方,很多时候你发现不了这个问题,因为有可能被CDN拦截了,如果前边有CDN,你可以查一下云厂商的CDN的url统计,我们之前光这个图片一天的CDN流量就数T。
相关推荐
- 基于Python查找图像中最常见的颜色
-
如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决很多实际问题。例如在农业领域中想确定水果的成熟度,我们可以通过检查水果的颜色是否落在特定范围内,来判断它们是否已经成熟。接下来我们将使...
- 出大要几次/圣彼得堡悖论
-
程序:fromrandomimportrandomdeffn():n=1whilerandom()<0.5:n+=1returnny=[fn()...
- 使用OpenCV测量图像中物体之间的距离
-
原文链接:https://www.pyimagesearch.com/2016/04/04/measuring-distance-between-objects-in-an-image-with-op...
- 让颜色更加饱满和有冲击力:图像颜色校正
-
大家拍照或图片时,获取会遇到图像颜色与实际颜色存在色差的现象。我们看一个标准色卡的图片:第一张图片就是有色差的图片,这种现象一般是相机或光线的原因造成的,我们可以通过标准色卡进行校正。第一张图片是有色...
- Python 数据分析 : 实例
-
1、构建矩阵生成4x4形式的矩阵,矩阵中的数据是1~10之间的随机数random_list=np.random.random(16)random_list=np.round(...
- 用这些免费开源的图标库,为你的项目画龙点睛
-
精致好看的图标能够为你的项目增色不少,今天我就整理了一期图标库精选系列,希望你可以从中找到自己喜欢的图标库。下面就跟我来一场视觉的盛宴,我会一一介绍GitHub上品牌、流行、极小,各具特色的免费精...
- ICON设计规范之图标尺寸
-
编辑导语:图标设计是UI设计中不可缺少的元素,它看似简单,但其实内含门道。本篇文章里,作者就对icon设计的相关知识和icon绘制方法做出经验介绍。如果你对icon设计也想要有所了解的话,那就点进来看...
- PHP开发必备VSCode插件(大全)
-
通用chinese(simplified...):简体中文语言包liveserverhtml:实时预览prettier-codeformatter:最流行的代码格式化插件...
- 增强用户体验:前端开发中HTML5和CSS3表格属性的应用与优化研究
-
摘要:本文探讨了在前端开发中HTML5和CSS3表格属性的应用与优化。首先介绍了HTML5中常用的表格元素和CSS3中丰富的表格样式属性,旨在帮助开发人员定制表格的外观和样式。其次,研究了表格结构的优...
- 产品经理小技术:图片素材随手找,原型设计快又好
-
数十万互联网从业者的共同关注!作者:牛冰峰博客:http://uxfeng.com/画图——这项古老而精细的做法,是一代代产品狗们得以传承的立足之本。草图、线框图、思维导图、PPT插图、数据汇报图表、...
- MAUI Blazor 项目实战 - 从0到1轻松构建多平台应用UI
-
前言最近在项目中尝鲜了MAUI,总体感受下来还是挺不错的,优缺点并存,但是瑕不掩瑜,目前随着.Net版本的迭代升级对它的支持也越来越友好,相信未来可期!感兴趣的朋友欢迎关注。文章中如有不妥的地方,也请...
- webstorm常用的插件
-
1、AtomMaterialIcons推荐原因:这款插件不仅...
- 「智能家居」自动化平台nodered第三方节点dashboard的使用
-
自带节点库讲完了,开始说说第三方节点库dashboard,该库提供另一个可配置的UI页面,可以配置一些表单元素,以及图表。先来看一下别人使用dashboard制作的面板吧,是不是很漂亮。接下来我们一...
- 「炫丽」从0开始做一个WPF+Blazor对话小程序
-
大家好,我是沙漠尽头的狼。...
- MAUI使用Masa blazor组件库
-
上一篇(点击阅读)我们实现了UI在Web端(BlazorServer/Wasm)和客户端(Windows/macOS/Android/iOS)共享,这篇我加上MasaBlazor组件库的引用,并...
你 发表评论:
欢迎- 一周热门
-
-
如何评估预测值与真实值之间的匹配质量
-
如何解决npm安装依赖报错ERESOLVE unable to resolve dependency tree
-
超详细的cmder工具介绍及功能、快捷键说明
-
畅网 N5105 四口 2.5G 小主机安装 WIN10 对比 WIN11 跑分
-
常见面试第三题之Activity的几种启动模式介绍
-
软件推荐丨gocron —— 定时任务管理系统
-
一分钟带你认识了解电信光猫(电信光猫有什么用途)
-
聊聊C++20最大的变革之一 —— Coroutine,看不懂你打我(一)
-
硬核!Rust异步编程方式重大升级:新版Tokio如何提升10倍性能详解
-
Vite 4.0 正式发布(vite版本)
-
- 最近发表
- 标签列表
-
- systemproperties (65)
- npm版本管理 (61)
- localhost:15672 (59)
- materialtheme (86)
- node-ssh (68)
- 图床搭建 (62)
- vue3addeventlistener (60)
- mybatisselectone (78)
- css圆形进度条 (69)
- androidble蓝牙开发 (62)
- android-gif-drawable (60)
- appender-ref (64)
- springbootmockito (68)
- css边框渐变色和圆角 (58)
- gsonfastjson (59)
- 依赖注入的方式 (62)
- cookie跨域共享 (63)
- easyexcel导出图片 (77)
- dp数组 (61)
- js获取兄弟节点 (68)
- sysctl-a (60)
- java知音 (58)
- window.target (62)
- apimodel注解的作用 (60)
- window.onerror (66)