专栏首页千里行走微服务框架saf-1:容器化部署allinone-demo

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

目录

(1).关于saf

(2).saf-allinone-demo说明

(3).容器化部署环境准备

1.硬件要求

2.K8S单节点集群搭建

3.容器化相关基础组件

3.1.基础中间件容器化准备

3.2.zookeeper容器化部署

3.3.mysql容器化部署

3.4.redis-cluster容器化部署

3.5.rocketmq-cluster容器化部署

3.6.apollo容器化部署

3.7.ingress容器化

3.8.配置相关的ingress代理

4.数据准备

(4).编译saf

1.下载工程

2.apollo配置基础组件

3.编译saf工程

(5).容器化部署saf-sample-allinone-service

1.制作saf-sample-allinoe-service镜像

2.容器化saf-sample-allinoe-service

(6).容器化部署saf-sample-allinone-web

(7).验证服务

1.验证spring boot actuator组件

2.验证业务接口(redis-cluster,motanRPC)

3.验证jvmCache(guava)

4.验证rocketmq使用

说明:

本文全部以容器化方式部署为例(主要是因为部署高效),非容器化类似。

(1).关于saf

项目地址:

https://github.com/hepyu/saf

1.一个微服务框架,完全基于注解的方式开发。

2.适用于云原生(K8S)下的微服务体系搭建,为技术中台提供底层支撑。

3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。

(2).saf-allinone-demo说明

工程地址:

https://github.com/hepyu/saf/tree/master/saf-samples/saf-sample-allinone

saf-allinone-demo涉及到的组件

demo中使用了主要的中间件,如redis-cluster(分布式缓存),druid(数据库连接池),motan(rpc),rocketmq(消息队列),apollo(分布式配置中心)

saf-allinone-demo包含的工程:

saf-sample-allinone-api:定义motan(rpc)接口

saf-sample-allinone-service:rpc-provider

saf-sample-allinone-web:rpc-consumer

(3).容器化部署环境准备

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.zookeeper容器化部署

https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/zookeeper-min

参考文章:kubernetes-14:zookeeper容器化

3.3.mysql容器化部署

https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/mysql-min

参考文章:kubernetes-5:使用helm与yaml两种方式进行mysql容器化

3.4.redis-cluster容器化部署

https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/redis-cluster-min

参考文章:kubernetes-20:redis-cluster容器化

3.5.rocketmq-cluster容器化部署

https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/rocketmq-min

参考文章:K8S&微服务&阿里云生产实践-3:rocketmq集群生成级别容器化

3.6.apollo容器化部署

https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/apollo-min

参考文章:

kubernetes-6:使用yaml方式进行apollo容器化

注意:使用容器化方式部署基础组件主要是为了快速构建allinone-demo的运行环境,实际生产中是需要权衡的,比如mysql不要放K8S里,而且上述基础组件的容器化都是最小资源防止超过硬件容量,比如rocketmq只有一组master/slave。

3.7.ingress容器化

https://github.com/hepyu/k8s-app-config/tree/master/yaml/min-cluster-allinone/ingress-nginx-min

参考文章:kubernetes-9:nginx-ingress容器化

3.8.配置相关的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

ingress-nginx-rocketmq-min-c0-console.yaml

然后在本地PC配置host即可访问对应的apollo和rocketmq后台。

4.数据准备

saf-allinone数据库数据初始化:

获得mysql的root用户的登录密码:

kubectl get secret --namespace mysql-min mysql-min -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo

root密码是:9ZeNk0DghH

暴露mysql端口到容器外(可以选择其他方式如nodeport等)方便访问:

我这里使用port-forward方式:

kubectl port-forward pod-name local-port:container-port

如:注意指定命名空间

kubectl port-forward mysql-min-6fdb6bb7bb-f5g9t -n mysql-min 3306:3306

登录mysql:

mysql -h 127.0.0.1 -uroot -p9ZeNk0DghH

执行初始化sql,位于:

https://github.com/hepyu/saf/blob/master/saf-samples/saf-sample-allinone/saf-sample-allinone-service/sql/allinone.sql.txt

由于apollo我们只支持dev环境,所以需要修改一下数据库记录:

use ApolloPortalDB

update ServerConfig set Value='dev' where id=1\G

否则apollo可能运行时出问题。

(4).saf-allinone-demo容器化部署

1.下载工程

git clone https://github.com/hepyu/saf.git

2.apollo配置基础组件

进入目录:

saf-samples/saf-sample-allinone/saf-sample-allinone-service

将apollo-config目录中的配置文件配置到apollo配置中心:dev.apollo-portal.future.com

apollo默认用户名是apollo,默认密码是admin。

需要创建的项目/namespace,附带每个namespace的内容地址:

配置内容的主路径位于:

https://github.com/hepyu/saf/tree/master/saf-samples/saf-sample-allinone/apollo-config

需要创建的apollo项目

需要创建的apollo namespace

用途

内容相对地址

名称

类型

saf.base

saf.actuator

public

spring boot actuator相关配置。

pulibc-namespaces/saf.actuator

saf.base.registry

public

注册中心配置,如zk等。

pulibc-namespaces/saf.base.registry

saf.log.level

public

日志级别。

pulibc-namespaces/saf.log.level

saf.monitor

public

监控配置。

pulibc-namespaces/saf.monitor

saf.rocketmq

saf.rocketmq.rocketmq-c0

public

rocketmq集群配置。

pulibc-namespaces/saf.rocketmq.rocketmq-c0

demo.db

demo.db.mall

public

demo业务线的商场DB配置。

pulibc-namespaces/demo.db.mall

demo.db.user

public

demo业务线的用户服务DB配置。

pulibc-namespaces/demo.db.user

demo.redis-cluster

demo.redis-cluster.user

public

demo业务线的用户服务的redis集群配置。

pulibc-namespaces/demo.redis-cluster.user

demo.redis-cluster.mall

public

demo业务线的商城服务的redis集群配置。

pulibc-namespaces/demo.redis-cluster.mall

demo.public-config

demo.public-config.pay

public

demo业务线公共配置:支付相关

pulibc-namespaces/demo.public-config.pay

demo.public-config.sms

public

demo业务线公共配置:sms短信相关。

pulibc-namespaces/demo.public-config.sms

demo.public-config.spide

public

demo业务线公共配置:爬虫相关。

pulibc-namespaces/demo.public-config.spide

demo.motan.referer

demo.motan.referer.mall

public

demo业务线商城rpcReferer。

pulibc-namespaces/demo.motan.referer.mall

demo.motan.referer.user

public

demo业务线用户rpcReferer。

pulibc-namespaces/demo.motan.referer.user

demo-allinone-service

application

private

port,logPath,rpcProvider等配置。

private-namespace-by-app/demo-allinone-service.application

demo-allinone-web

application

private

port,logPath等配置。

private-namespace-by-app/demo-allinone-web.application

从上表可以看到,我们是对apollo配置中心的使用制定了自定义规约的,本文重点不在这里,暂时不对此自定义规约进行详细描述,后续会做详细描述。

关于这部分,可以先参照文章:

K8S&微服务&阿里云生产实践-2:apollo配置中心

里边有一张图描述了自定义规约。

3.编译saf工程

进入saf根目录编译整个工程,同时将saf基础包装配到本地maven仓库:

mvn clean package

mvn install

(5).容器化部署saf-sample-allinone-service

1.制作saf-sample-allinoe-service镜像

在目录saf-samples/saf-sample-allinone/saf-sample-allinone-service下执行脚本docker.build.sh 制作docker镜像:

sh docker.build.sh

如果失败检查下docker.build.sh和Dockerfile中的demo版本,可能需要修正(saf版本升级不会修改Dockerfile和docker.build.sh中的版本)。

镜像构建过程如下:

Sending build context to Docker daemon 42.98MB

Step 1/9 : FROM hpy253215039/oraclejdk-linux-64:8u221

---> 98948e987d47

Step 2/9 : ADD target/saf-sample-allinone-service-1.0.1-SNAPSHOT.jar /app/inc/apps/

---> 04f1f80e073c

Step 3/9 : RUN chown -R inc:inc /app/inc/ /data/inc/ /opt/ && mkdir -p /data/inc/logs/saf-sample-allinone-service

---> Running in f868e3883898

Removing intermediate container f868e3883898

---> e2e7f4a624ea

Step 4/9 : COPY run.sh /app/inc/apps/

---> 33435cadd6a6

Step 5/9 : WORKDIR /app/inc/apps

---> Running in 0464247f7b7f

Removing intermediate container 0464247f7b7f

---> 33ebebd3fa4e

Step 6/9 : EXPOSE 8080

---> Running in f434fbefe4fb

Removing intermediate container f434fbefe4fb

---> a033e4a37def

Step 7/9 : EXPOSE 9145

---> Running in 6f05cd6e0afb

Removing intermediate container 6f05cd6e0afb

---> e4de92f0bd5c

Step 8/9 : EXPOSE 10010

---> Running in 7b70d6922a09

Removing intermediate container 7b70d6922a09

---> 44622491d60e

Step 9/9 : ENTRYPOINT /bin/bash run.sh start && tail -f /dev/null

---> Running in 7b6887c02fad

Removing intermediate container 7b6887c02fad

---> 69fe35c6cffe

Successfully built 69fe35c6cffe

查看镜像:

2.容器化saf-sample-allinoe-service

进入目录saf-sample-allinoe-service/kubernetes:

直接执行脚本deploy.sh,会顺次执行上述yaml文件,执行kubectl get pod -n inc查看Pod,可能会看到启动失败:

这是因为saf升级不会自动升级脚本中的版本号,需要手动修改saf-sample-allinone-service-prod-deployment.yaml中的镜像版本号为1.0.1。

执行kubectl delete -f . 删除刚才部署的资源,重新执行sh ./deploy.sh可以看到容器启动成功。

(6).容器化部署saf-sample-allinone-web

过程类似,这里简单描述。

进入目录:

saf-samples/saf-sample-allinone/saf-sample-allinone-web

1.制作saf-sample-allinoe-web镜像

在目录saf-samples/saf-sample-allinone/saf-sample-allinone-web下执行脚本docker.build.sh 制作docker镜像:

sh docker.build.sh

2.容器化saf-sample-allinoe-web

进入目录saf-sample-allinoe-web/kubernetes直接执行脚本deploy.sh。

这里有一个文件会把这个web服务挂到ingress上,从而将服务暴露到容器外部,供公网访问:

saf-sample-allinone-web-prod-ingress.yaml

(7).验证服务

我们先查看saf-sample-allinoe-web的域名:

[root@future kubernetes]# kubectl get ingress -n inc

NAME HOSTS ADDRESS PORTS AGE

pro-apollo-configservice002 pro-apollo-configservice002 ip1 80 10d

pro-apollo-configservice003 pro-apollo-configservice003 ip1 80 10d

saf-sample-allinone-web-prod saf-web-allinone.future.com ip1 80 21m

service-apollo-portal-server dev.apollo-portal.future.com ip1 80 10d

配置host:

Ip1 saf-web-allinone.future.com

1.验证spring boot actuator组件

浏览器访问http://saf-web-allinone.future.com:30834/actuator/health

返回:{"status":"UP"}

2.验证业务接口(redis-cluster,motanRPC)

业务接口使用了redis-cluster,motanRPC,jvmCache(guava),业务接口正常返回说明上述组件OK。

http://saf-web-allinone.future.com:30834/user/getUserDetail?userId=1

返回:

{"code":0,"msg":"getUserDetail success.","data":{"id":1,"name":"user1","shopList":[{"id":1,"name":"shop1","ownerId":1,"address":"address1"}]}}

http://saf-web-allinone.future.com:30834/shop/getShopDetail?shopId=1

返回:

{"code":0,"msg":"getShopDetail success.","data":{"id":1,"name":"shop1","ownerId":1,"address":"address1","owner":{"id":1,"name":"user1"}}}

http://saf-web-allinone.future.com:30834/config/getSMSConfig

返回:

{"code":0,"msg":"getSMSConfig success.","data":{"aliyunSMSUrl":"https://sms.aliyun.com/sendSMS","mobileSMSUrl":"https://sms.chinamobile.com/sendSMS","unicomSMSUrl":"https://sms.chinaunicom.com/sendSMS"}}

3.验证jvmCache(guava)

这个只能到saf-service-allinone的pod容器里看了,会定时打印guava的访问统计信息,这个在真实业务中其实是可以做成metrics,然后加监控的,因为一般这么用都是一个高访问高并发的场景。

framework.log-2019-11-28 22:09:00.001 [scheduling-1] [INFO] [-] [c.f.s.s.a.l.ShopModelSafWrapperLocalCache] - cache container current size is:5

framework.log-2019-11-28 22:09:00.001 [scheduling-1] [INFO] [-] [c.f.s.s.a.l.ShopModelSafWrapperLocalCache] - cache container: threadPool.queueInfo: size:0, remainingCapacity:2147483647

framework.log-2019-11-28 22:09:00.001 [scheduling-1] [INFO] [-] [c.f.s.s.a.l.ShopModelSafWrapperLocalCache] - cache container: threadPool.info: activeCount:0, corePoolSize:10, maximumPoolSize:10, poolSize:10, completedTaskCount:40, largestPoolSize:10, taskCount:40

framework.log-2019-11-28 22:09:00.001 [scheduling-1] [INFO] [-] [c.f.s.s.a.l.ShopModelSafWrapperLocalCache] - cache container: cache.stats: averageLoadPenalty:1.0904045166666666E7, evictionCount:0, hitCount:40, hitRate:0.8888888888888888, loadCount:42, loadExceptionCount:0, loadExceptionRate:0.0, loadSuccessCount:42, missCount:5, missRate:0.1111111111111111, requestCount:45, totalLoadTime:457969897,

4.验证rocketmq使用

到rocketmq-console后台查看:

http://pro-rocketmq-min-c0.console.future.com:30834/#/message

至此,验证通过了redis-cluster, rocketmq, jvmCache(guava), spring boot actuator, motanRPC的正确使用。

本文分享自微信公众号 - 千里行走(a_thousands_of_miles),作者:千里行走

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。

    千里行走
  • 微服务框架saf-6:saf-http之度量

    3.解放业务,使业务方专注于业务逻辑本身:通过注解以搭积木方式引入各式资源,每个资源都是一行注解,极大提升业务方产出效率。

    千里行走
  • kubernetes-6:使用yaml方式进行apollo容器化

    http://toutiao.com/item/6698283305726378504/

    千里行走
  • pandas画图的几个技巧

    我们经常会用pandas处理数据,处理完之后,很多时候会画个图看看。但是pandas默认的曲线就只有十种颜色,如果我们要绘制的数据过多,就会出现颜色重复。其实很...

    钱塘小甲子
  • CloudFlare:为什么能从富达、谷歌、微软、百度和高通筹到1.1亿美元?

    CloudFlare是一家从事网络性能和安全领域的初创公司。创始人兼首席执行官Matthew Prince在7岁的时候就能编写了第一个没有Bug的计算机程序,还...

    CSDN技术头条
  • WGAN与WAE

    这种定义方式可以理解为所谓的“伪造者”,“判断者”用博弈论的方式理解,也可以视为分布拟合,窃以为后一种理解方式更为通用。接下来就可以进入主题看看WGAN的优化目...

    用户1908973
  • 「服务器」Oauth2验证框架之项目实现

    Oauth2.0是一个很通用的验证框架,很多编程语言都对其进行了实现,包括Java、PHP、Python、NodeJS、Ruby、NET、Erlang、Go、C...

    ZhangXianSheng
  • Java开发知识之Java中的集合上List接口以及子类讲解.

      如果你学习说数据结构,那么学习集合就很简单. 因为集合就是存储数据的结构. 例如 有链表结构 (list ) 还有 map结构.等等.

    IBinary
  • 斯坦福教授比特币讲座引学生不满;Facebook即将发行稳定币 | 1分钟链圈

    1. Ethhub创始人:JPM Coin将会是一个发行在Quorum上的稳定币,并兼容其它的区块链

    区块链大本营
  • PHP中AJAX的使用(完整实例【大牛可飘过】)

      有一段时间不写关于AJAX的东西了,最近和同学参加个比赛,要做一个类似博客的东西,用到了AJAX的东西,在写东西之前为了再熟悉一下AJAX,自己做了个关于A...

    lizelu

扫码关注云+社区

领取腾讯云代金券