一、代码如下
注意:这里dubbo的服务打包比较恶心,要加一堆插件执行打包,不像springboot那样比较简单。
二、把服务做到镜像中
0、主机打包测试运行下
我们到之前克隆好的项目目录下
执行打包命令
mvn package
注意,这里有报错,我们需要把这个dubbo-demo-api安装一下。
cd dubbo-demo-api/
mvn install
然后回到刚刚的目录。
cd ../
cd dubbo-demo
ls
再次执行打包命令
mvn package
查看输出了什么
cd target/
ll
使用jar命令看下
tar -tf dubbo-demo-1.0-SNAPSHOT-assembly.tar.gz
然后进行解压一下
tar -xvf dubbo-demo-1.0-SNAPSHOT-assembly.tar.gz
cd bin/
ls
运行一下
sh start.sh
去看下日志
cd ..
ls
cd logs/
less stdout.log
再看下端口
cd conf/
ls
vi dubbo.properties
端口是20880
netstat -ntlp|grep 20880
进行测试
telnet 10.155.20.50 20880
进入之后,输入如下命令可以测试
ls
ls com.mooc.demo.api.DemoService
invoke com.mooc.demo.api.DemoService.sayHello("Dick")
exit
然后,我们再去使用下停止的命令
sh stop.sh
测试下端口是不是没有了
netstat -ntlp|grep 20880
1、搞定基础镜像
我们这个服务也只用java的镜像就行了。
这个我们用之前推送到镜像仓库的镜像就行。
2、搞定服务运行的相关文件
就是我们打包生成的.tar.gz的文件
3、构建镜像
注意,我们这个文件是一个压缩包,我们要新建个目录,把压缩包移动到里面
mkdir ROOT
mv dubbo-demo-1.0-SNAPSHOT-assembly.tar.gz ROOT/
cd ROOT
ls
tar -xvf dubbo-demo-1.0-SNAPSHOT-assembly.tar.gz
删除压缩包
rm -f dubbo-demo-1.0-SNAPSHOT-assembly.tar.gz
ls
然后到这个目录写Dockerfile
vi Dockerfile
内容如下:
FROM hub.mooc.com/kubernetes/openjdk:8-jre-alpine
COPY target/ROOT /ROOT
ENTRYPOINT ["sh", "/ROOT/bin/start.sh"]
注意,我们要把start.sh的脚本修改一下,因为是后台运行,运行完就结束了,我们改成前台运行。
把红色框部分删掉
修改后如下:
stop.sh就不用修改了。
开始构建镜像
docker build -t dubbo:v1 .
我们发现有个报错
把 start.sh里,红色框区域全部删除。
删除后如下:
再次构建
docker build -t dubbo:v1 .
我们发现这个一直卡在这里,去看下脚本
因为这里把日志重定向了,可以去掉,也可以启动后到容器里看,这里我选择去掉。
去掉后如下:
再构建
docker build -t dubbo:v1 .
这里镜像就创建成功了,下面我们来docker run一下。
docker run -it dubbo:v1
将镜像推送到仓库里。
docker tagdubbo:v1 hub.mooc.com/kubernetes/dubbo:v1
docker push hub.mooc.com/kubernetes/dubbo:v1
三、制作k8s服务并调度
注意,dubbo的服务发现使用host模式,如果使用桥接的话,因为有个zookeeper,因容器的provider有个内部网段的ip,会把这个ip注册到zookeeper上,consumer会读这个provider内部网段的ip。。如果是集群内部是没问题的,如国是集群外的就无法访问。
如果非要使用桥接,可以在启动的时候设置环境变量,在环境变量指定宿主机的真实ip,但这个环境变量不好搞,如何在启动的时候拿到宿主机的ip也麻烦,所以只能在宿主机上写个文件挂载到容器中。
太麻烦,就不用这种了。
host也有一个问题,端口是直接启动在宿主机上的,如20880,如果后续还有其他的dubbo服务也是20880就冲突了。
所以使用host必须保证每个dubbo服务的端口不一样,我们使用k8s上用脚本实现。
在 start.sh中添加红色框区域
1、确定服务发现策略
dubbo.yaml的内容如下:
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: dubb-demo
spec:
selector:
matchLabels:
app: dubb-demo
replicas: 1
template:
metadata:
labels:
app: dubb-demo
spec:
hostNetwork: true
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- dubb-demo
topologyKey: "kubernetes.io/hostname"
containers:
- name: dubb-demo
image: hub.mooc.com/kubernetes/dubbo:v1
ports:
- containerPort: 20880
下面来apply一下
kubectl apply -f dubbo.yaml
看下是否启动了起来
kubectl get pods
kubectl get pods -o wide
运行在120上,上去看下端口是否被监听
netstat -ntlp|grep 20880
再测试下:
ls
ls com.mooc.demo.api.DemoService
invoke com.mooc.demo.api.DemoService.sayHello("Dick")
exit
下面我们再来试试定义一个环境变量
修改dubbo.yaml配置文件
下面来apply一下
kubectl apply -f dubbo.yaml
修改后如下:
注意要加双引号,不然会报错!!
再次apply
kubectl apply -f dubbo.yaml
kubectl get pods -o wide
kubectl get pods -o wide | grep dubb
去121上测试
测试