百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

微服务框架saf-5:saf-http与demo的解析与体验,以及容器化部署

toqiye 2024-11-27 21:08 8 浏览 0 评论

相关文章

微服务框架saf-1:saf工程结构拓扑解析

微服务框架saf-2:容器化部署allinone-demo

微服务框架saf-3:saf-dubbo与demo的解析与体验与容器化部署

微服务框架saf-4:saf-dubbo之度量

docker-1:本地开发打通宿主机与docker服务网络

阿里云&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的方式,具体步骤参加文章:

docker-1:本地开发打通宿主机与docker服务网络

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

  1. 编译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组件库的引用,并...

取消回复欢迎 发表评论: