(*).相关资料
生产级kubernetes实践:
https://github.com/hepyu/k8s-app-config
生产级微服务框架:
https://github.com/saf-group/saf
目录
(1).需求
(2).sentinel-dashboard镜像制作与docker化
1.镜像工程
2.Dockerfile文件
3.docker-compose.yml与重要注意事项
3.1.docker-compose.yml文件详述
3.2.网卡关联
3.3.docker network相关命令
4.本地docker化sentinel-dashboard
(3).服务接入sentinel-dashboard
(1).需求
笔者经常在本地mac本上研究一些东西,需要一个本地的开发环境,使用docker来管理环境是一个性价比非常高的做法,方便调试。
为什么不在公司的服务器上做?
因为太危险,现代IT技术的发展尤其是容器化技术的普及,虽然带来了生产效率的大幅度提升,但同时也加大了风险,一条命令就可以删掉所有服务,有很多真实发生的例子。而高级架构师的权限是非常大的,几乎拥有系统所有权限,需要有良好的习惯和本地能力。
PS:
我在做相关开发/研究/查证时,一定会把公司的所有窗口全部关闭,反之一样,两者绝对不并行进行,太危险了。
(2).sentinel-dashboard镜像制作与docker化
1.镜像工程
可以自行从github下载并编译,或者直接下载release的编译好的版本,如:
https://github.com/alibaba/Sentinel/releases/download/1.7.1/sentinel-dashboard-1.7.1.jar
笔者提供sentinel-dashboard镜像制作的工程,位于:
https://github.com/hepyu/sentinel-dashboard-docker-image.git
2.Dockerfile文件
#基础镜像
#centos版本不要超过宿主机的centos版本
FROM hpy253215039/oraclejdk-skywalking-linux-64:8u221
MAINTAINER [email protected]
RUN mkdir -p /sentinel-dashboard \
;mkdir -p /data/logs
#ADD ./config/ /sentinel-dashboard/
ADD ./jar/1.7.1/ /sentinel-dashboard/
EXPOSE 8080
CMD java ${JAVA_OPTS} -jar /sentinel-dashboard/sentinel-dashboard-1.7.1.jar
注意,使用的是包含skywalking的镜像:oraclejdk-skywalking-linux-64,如果skywalking与sentinel可以结合使用,可以看到有哪些服务使用了sentinel限流,较实用。后续有时间研究一下。
3.docker-compose.yml与重要注意事项
3.1.docker-compose.yml文件详述
version: '2'
services:
sentinel:
image: hpy253215039/sentinel-dashboard:1.7.1
container_name: sentinel
restart: on-failure
environment:
JAVA_OPTS: "-Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -Djava.security.egd=file:/dev/./urandom -Dcsp.sentinel.api.port=8719"
ports:
- "8718:8080"
- "8719:8719"
networks:
- default
networks:
default:
external:
name: docker-quick-start_default
field | 说明 |
-Dserver.port=8080 | 指定sentinel-dashboard的web端口 |
-Dcsp.sentinel.dashboard.server=localhost:8080 | 把sentinel-dashboard自己注册到控制台 |
-Djava.security.egd=file:/dev/./urandom | 加快随机数产生过程。 Linux中的随机数可以从两个特殊的文件中产生,一个是/dev/urandom.另外一个是/dev/random。他们产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回。熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果就不是很好了。 |
-Dcsp.sentinel.api.port=8719 | 客户端提供给dashboard访问或者查看sentinel的运行数据。 |
3.2.网卡关联
本地开发有一个问题,即宿主机与docker容器中的服务不在一个网段,且如果docker中的容器不关联指定网卡时,不同的container的网段也不一样,这样本地完全没有办法用。
所以我们要解决两个问题:
问题1:本地机器与docker容器网络互通。
这个使用vpn解决,参照笔者文章:
问题2:统一docker中不同容器的网段
比如,创建一个docker-net:
docker network create --subnet=172.18.0.0/16 docker-net
然后通过docker-compose.yml文件中绑定,绑定方式如:
services:
......
networks:
- default
networks:
default:
external:
name: docker-quick-start_default
笔者由于已经在本地docker-compose化了dev环境的apollo,所以直接用apollo的subnet作为sentinel的绑定源。
apollo的dev容器化参见官方,docker-compose化脚本位于:
https://github.com/ctripcorp/apollo/tree/master/scripts/docker-quick-start
3.3.docker network相关命令
docker network ls:查看本地网络
localhost:sentinel-dashboard-docker-image hpy$ docker network ls
NETWORK ID NAME DRIVER SCOPE
340e1147ea14 bridge bridge local
ba521e40aa4a docker-mac-network_default bridge local
afc2a047ff9a docker-quick-start_default bridge local
a4d50cbee98c docker_default bridge local
3b9a2701fbf2 host host local
43764f85fd7c kong-net bridge local
79832d32db34 macvlan_net macvlan local
a4d4942ba567 none null local
a063dc7efb24 sentinel-dashboard-docker-image_default bridge local
Docker network inspect docker-quick-start_default:查看网络详情,内容过多就不截取了。可以看到网段。
4.本地docker化sentinel-dashboard
直接执行sh ./docker-image.sentinel-dashboard.sh进行镜像构建。
然后执行docker化命令:
docker-compose up -d
-d表示后台运行。
本地浏览器访问:http://localhost:8718/#/dashboard/home
实际生产中会配合prometheus,grafana的强大能力进行全面度量,图过大文中不清晰,大图位于:
https://github.com/hepyu/sentinel-dashboard-docker-image/blob/master/images/image-1.png
(3).服务接入sentinel-dashboard
注意,如果不使用阿里云的ahas服务,不要使用如下jar包,否则会自动连阿里云的ahas而造成sentinel-dashboard的数据收集端口启动失败,无法接入服务。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>ahas-sentinel-client</artifactId>
</dependency>
要接入的服务需要增加如下启动参数:
-Dproject.name=demo-http-receive -Dcsp.sentinel.dashboard.server=sentinel-dashboard-docker-ip:8080 -Dcsp.sentinel.api.port=8733
因为有vpn打通,所以直接写sentinel-dashboard容器的ip即可。容器ip可以通过命令:
docker inspect 容器name | grep -i ipaddress获得。