首先要在电脑上安装docker,在windows上运行docker可能出现的常见问题解决方法:解决点击Docker出现windows 正在查找bash.exe。下面以windows操作系统为例,以docker方式运行eureka项目。
1.在项目根目录创建Dockerfile文件
FROM hub.c.163.com/library/java:8-alpine 从网易云镜像中心获取java镜像
ADD target/*.jar app.jar 添加target目录下生成的项目jar包到容器中并且重命名为app.jar
EXPOSE 8761 声明端口 8761
ENTRYPOINT ["java","-jar","/app.jar"] 以java -jar的方式运行
2.创建docker镜像
(1)构建java应用:mvn clean package -Dmaven.test.skip=true
(2)构建docker镜像:docker build -t springcloud/eureka .(这里的点表示当前路径)
(3)启动:docker run -p 8761:8761 -d springcloud/eureka
3.访问项目
如果想要运行多个eureka实例,可以在docker里面执行
docker run -p (想要运行的端口):8761 -d springcloud/eureka
就可以通过ip:端口的方式来访问项目。
注:如果想要别人使用你的镜像,就可以将本地镜像推送到镜像中心,网易云、腾讯云等都有提供相应的镜像仓库服务,并有详细的如何推送镜像的教程,并且要将镜像设置为公开。
rancher官网
rancher中文站点
Rancher是一个开源的企业级全栈化容器部署及管理平台,简单的说就是为了更加方便的管理docker。官网上说明了使用rancher的要求和步骤,在这里我使用的腾讯云的云服务器CentOS 7.4 64位 (记为服务器A)。
1.在服务器A上安装docker
在centos服务器上安装docker:yum install docker
启动docker:systemctl start docker
查看docker信息 : docker info
查看docker版本: docker version
2.安装rancher
rancher-server非常大(1GB左右),如果直接执行安装语句的话,在服务器A上下载会非常慢,可以先配置一个加速地址。
修改文件vim /etc/docker/daemon.json
添加如下内容:{"registry-mirrors": ["https://fy707np5.mirror.aliyuncs.com"]}
保存之后执行
systemctl daemon-reload
systemctl restart docker
然后执行安装命令
sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:stable
执行成功之后就可以通服务器A的ip:8080 来访问(注意要开启对应端口的防火墙和安全组)
访问的界面如图所示,需要添加主机:
3.添加主机
保存当前站点
添加主机,这里使用了同学的腾讯云服务器(记为服务器B)。
在服务器B上安装docker,启动docker之后执行第5点里面的脚本在主机上注册rancher,会在服务器B上安装rancher-agent,在服务器B上成功安装rancher-agent之后显示如下信息:
安装成功之后点击第6点的关闭按钮。在主机界面显示如下:
这些应用也是正常启动
这里使用腾讯云作为镜像仓库,推送镜像到镜像仓库,对于每个服务的部署都是一样的操作,因此可以在项目目录下写一个脚本。
#!/usr/bin/env bash
mvn clean package -Dmaven.test.skip=true -U 构建java项目
docker build -t ccr.ccs.tencentyun.com/wuqiong/eureka . 构建docker镜像()
docker push ccr.ccs.tencentyun.com/wuqiong/eureka 将镜像推送到镜像仓库
在git命令行中进入eureka项目根目录,执行bash build.shell运行脚本,上传镜像。
推送成功之后可以看到推送的镜像,注意一定要将镜像改成公开,否则rancher上拉取不到
(1)添加应用springcloud
(2)在springcloud应用里面添加eureka服务
(3)成功添加之后可以查看启动日志,也可以在日志中排查问题。通过主机ip:端口号来访问eureka项目。
服务注册中心eureka要实现高可用,多个服务之间应该两两注册。可以利用springboot的配置文件来实现,springboot可以针对不同环境,读取相应的的配置文件来启动项目。在eureka项目下创建多个配置文件application-eureka1.yml和application-eureka2.yml。相应的内容如下:
#application.yml的内容,默认读取application-eureka1.yml的配置文件
spring:
profiles:
active: eureka1
#application-eureka1.yml的配置文件
eureka:
client:
service-url:
#在rancher中可以直接通过服务名称eureka2找到eureka2服务,将eureka1注册到eureka2上
defaultZone: http://eureka2:8762/eureka/
#这个注解的意思就是不会出现在注册应用的列表里面
register-with-eureka: false
server:
#不使用自我保护模式
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8761
#application-eureka2.yml的配置文件
eureka:
client:
service-url:
#将eureka2注册到eureka1上
defaultZone: http://eureka1:8761/eureka/
register-with-eureka: false
server:
#不使用自我保护模式
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8762
在本地的启动方式为:
java -jar -Dspring.profiles.active=eureka1 target/*.jar
可以通过相应的配置文件来进行启动
在rancher中进行添加服务的时候与最开始不同的是需要在最下面添加环境变量。
就可以在rancher上构建eureka的高可用
(1)在config项目里面添加Dockerfile和build.shell脚本,将Dockerfile里面的端口声明改成8080。
#Dockerfile文件内容
FROM hub.c.163.com/library/java:8-alpine
MAINTAINER xxx [email protected]
ADD target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
#build.shell脚本内容
#!/usr/bin/env bash
mvn clean package -Dmaven.test.skip=true -U
docker build -t ccr.ccs.tencentyun.com/wuqiong/config .
docker push ccr.ccs.tencentyun.com/wuqiong/config
(2)修改config项目的配置文件,有两点需要注意。一是要修改config的注册中心的url,第二点是需要添加一个配置,否则docker容器内部的服务之间是不能通信的,这个问题在在后面部署product项目的时候演示!
config具体配置如下,根据实际自己的实际情况来:
spring:
application:
name: config
cloud:
config:
server:
git:
uri: git地址
username: 用户名
password: 密码
#在本地不需要写rabbitmq的配置就可以发送消息
rabbitmq:
host: rabbitmq主机ip
port: 5672
username: 用户名
password: 密码
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/
instance:
prefer-ip-address: true
management:
endpoints:
web:
exposure:
include: "*"
(3)在git命令行中进入config项目根目录,执行bash build.shell运行脚本,上传镜像,并改成公开。
(4)在speingcloud应用中添加config服务。
公开主机端口可以不写,rancher会帮我们创建一个端口,供我们来访问测试。
创建成功之后我们可以通过主机ip(服务器B的ip):端口号来访问对应的配置文件,看config项目是否正常运行。对应的端口号是53851,注意一定要在安全组里面添加该端口的访问权限。
成功访问order-test.yml的配置文件。
(1)在product项目里面添加Dockerfile和build.shell脚本,将Dockerfile里面的端口声明改成8080。需要注意的是product项目构建成了多模块,Dockerfile文件要进行一定的修改,否则会出错。
#product项目的Dockerfile
FROM hub.c.163.com/library/java:8-alpine
ADD server/target/*.jar app.jar(路径要进行修改)
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
(2)修改配置文件,修改注册中心以及添加eureka.instance.prefer-ip-address:true的配置,使注册到Eureka Server上的是IP,否则order服务不能通过fegin与product项目进行通信。还需要在配置文件里面修改mysql、rabbitmq以及redis的主机ip,我在自己的服务器上安装了这些服务,将配置改成了是我自己服务器上地址以及相应的用户名和密码。rancher只进行容器的管理,想mysql、rabbitmq等基础服务不会变化和重新部署,使用自己本机上的服务即可。
下面对eureka.instance.prefer-ip-address:true这个配置进行演示和说明:
rancher在创建服务的时候,会生成一个ip地址供服务之间调用
当在config项目里面没有配置这个属性时,product项目不能正常拉取配置,原因是注册到Eureka Server上的不是ip,而是一串字符,这串字符在服务之间是不能相互通信的
在product服务的命令行里面ping 这一串字符看能不能ping通:
无法ping通这个地址,是无法拉取配置文件的!
当在config项目里面配置这个属性时,product项目可以正常拉取配置,注册到Eureka Server上的是ip,可以正常拉取配置
由此可以看出eureka.instance.prefer-ip-address:true配置的重要性。
(3)在git进入product项目根目录,执行bash build.shell运行脚本,上传镜像,并改成公开。
(4)在speingcloud应用中添加product服务。
公开主机端口可以不写,rancher会帮我们创建一个端口,供我们来访问测试。
访问product项目的list接口:
(1)在order项目里面添加Dockerfile和build.shell脚本,将Dockerfile里面的端口声明改成8080。运行脚本创建镜像。
(2)修改配置文件,修改注册中心以及添加eureka.instance.prefer-ip-address:true的配置
(3)在git命令行中进入order项目根目录,执行bash build.shell运行脚本,上传镜像,并改成公开。
(4)在springcloud应用中添加order服务。
测试创建订单的接口,使用Restlet Client来进行测试:
按照以上操作同样部署api-gateway,在添加服务时不写端口映射。
给api-gateway添加负载均衡
负载均衡创建成功
查看端口和负载均衡的规则可知:对外暴露的端口是主机(服务器B)的80端口,访问主机的80端口其实就是将请求转发到springcloud/api-gateway服务中。
总结:在rancher里面不将api-gateway的接口暴露出来,这样做的好处就是可以很方便的实现扩容(经过测试如果在添加服务的时候填写端口映射,添加服务数量的时候会出错),实现负载均衡的话,对外暴露的就是主机的80端口,会做一个负载均衡,把流量分发到多个api-gateway服务上去,从而实现api-gateway的高可用。
其他服务不需要添加负载均衡器,其他服务已经注册到eureka上面,服务调用的时候通过fegin(内置ribbon)自动的做到负载均衡,因此其他的服务在rancher这边是不需要配置负载均衡器的。