容器部署Spring Cloud项目
部署eureka和config
最后我们在rancher上部署eureka和config项目,首先我们需要在本地创建这两个项目的docker镜像,然后推送到网易云镜像仓库上。
关于使用Docker部署项目以及Rancher的安装及使用,可以参考我另外两篇文章,本文则不再赘述了:
在eureka项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:
FROM hub.c.163.com/library/java:8-alpine
MAINTAINER zeroJun xxx@example.com
ADD target/*.jar app.jar
EXPOSE 8761
ENTRYPOINT ["java", "-jar", "/app.jar"]
然后push到git仓库上,接着到服务器上,克隆这个仓库,并且登录你的网易云镜像仓库账户:
[root@01server ~]# cd /tmp
[root@01server /tmp]# git clone git@gitee.com:Zero-One/eureka.git
...
[root@01server /tmp]# cd eureka/
[root@01server /tmp/eureka]# docker login -u {登录账号} -p {你的网易云密码} hub.c.163.com
[root@01server /tmp/eureka]#
注:由于windows下不太方便使用docker,所以我将项目上传到远程的git仓库,然后在一台CentOS服务器上完成这些操作。
编写一个简单的shell脚本来完成build镜像的工作:
[root@01server /tmp/eureka]# vim build_eureka.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/eureka .
docker push hub.c.163.com/zerojun/eureka
[root@01server /tmp/eureka]#
运行脚本:
[root@01server /tmp/eureka]# sh ./build_eureka.sh
脚本执行完成后,到镜像仓库上可以看到镜像已经成功push上来了:
完成eureka镜像的build后,我们使用同样的套路build config项目的docker镜像。同样的,在config项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:
FROM hub.c.163.com/library/java:8-alpine
MAINTAINER zeroJun xxx@example.com
ADD target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
并且修改配置文件中eureka的地址为服务名称,如下:
eureka:
client:
service-url:
defaultZone: http://eureka:8761/eureka/ # 修改为rancher上的服务名称
然后push到git仓库上,接着到服务器上,克隆这个仓库,由于之前已经登录过网易云镜像仓库账户,所以不用登录了:
[root@01server /tmp]# git clone git@gitee.com:Zero-One/config.git
...
[root@01server /tmp]# cd config/
[root@01server /tmp/config]#
同样编写一个简单的shell脚本来完成build镜像的工作:
[root@01server /tmp/config]# vim build_config.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/config .
docker push hub.c.163.com/zerojun/config
[root@01server /tmp/config]#
运行脚本:
[root@01server /tmp/config]# sh ./build_config.sh
脚本执行完成后,此时镜像仓库上就有eureka和config的镜像了:
默认push的镜像都是私有的访问权限,我们需要设置为公开的,否则无法被外部访问:
点击镜像可以查看到镜像仓库详情,复制镜像的下载地址:
到rancher上部署工作负载:
部署完成:
使用浏览器看看是否能访问到eureka的信息面板:
eureka部署成功后,使用同样的方式去部署config:
不过我这里部署config失败,错误日志如下,提示无法启动内嵌的Tomcat:
尝试多次更改配置后,最后发现原来在pom.xml中,需要增加如下依赖(然而我本地没这个依赖运行却是正常的):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
并且需要修改配置文件如下:
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://gitee.com/Zero-One/config-repo
username: username
password: password
rabbitmq:
host: 127.0.0.1
port: 5672
username: username
password: password
eureka:
client:
service-url:
defaultZone: http://192.168.190.130/eureka/ # 修改为主机ip
instance:
prefer-ip-address: true # 让eureka上的地址能够跳转到实例的ip地址
management:
endpoints:
web:
exposure:
include: "*"
修改之后,需要重新push代码并build镜像,接着再到rancher上重新部署,这次就部署成功了:
也成功在注册中心注册上了:
但是我在浏览器上尝试去访问配置文件的时候无法访问,错误提示无法克隆仓库:
Cannot clone or checkout repository: https://gitee.com/Zero-One/config-repo
浏览器返回的信息如下:
经过一番排查后,发现是这个容器内无法ping通外网,所以无法克隆远程的仓库。确定问题后,马上查找不能ping通外网的原因。发现是因为Alpine系统使用了musl libc,与其他Linux发行版使用的glibc实现会有所不同,即musl实现的DNS服务不会使用resolv.conf文件中的search和domain两个配置。于是进入到容器中手动配置一下DNS解析,如下:
# vi /etc/resolv.conf
nameserver 218.2.135.1
nameserver 202.102.24.35
另一个方法是到rancher上修改容器的网络设置,这种方式会方便一些,因为容器会经常销毁、重建,每次都手动去配置DNS比较麻烦。如下:
注:使用这种方法会导致无法使用rancher的服务发现功能,也就是不能配置rancher里的服务名了,只能配置主机的ip地址
问题解决后,这时终于能够成功访问到配置文件了:
构建eureka高可用服务
在上一小节中,我们完成了eureka和config服务的部署,也解决了一些坑,但是还有个问题,就是目前eureka是单点的。eureka作为整个服务的注册中心,必然是需要高可用的,所以本小节我们来看看如何构建eureka高可用服务。首先创建application-eureka1.yml和application-eureka2.yml两个配置文件,如下:
application-eureka1.yml内容如下:
eureka:
client:
service-url:
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:
defaultZone: http://eureka1:8761/eureka/
register-with-eureka: false
server:
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8762
application.yml文件内容如下,默认选择eureka1:
spring:
profiles:
active: eureka1
然后push这些改动到远程的git仓库上,然后到服务器上拉取代码并重新build镜像:
[root@01server ~]# cd /tmp/eureka/
[root@01server /tmp/eureka]# git pull origin master
...
[root@01server /tmp/eureka]# sh ./build_eureka.sh
[root@01server /tmp/eureka]#
镜像制作完成并推送到仓库上后,到rancher上删除之前的eureka,然后部署eureka1:
接着部署eureka2:
相对的,config也需要修改一下配置文件,需要增加eureka节点,如下:
eureka:
client:
service-url:
defaultZone: http://192.168.190.130:8761/eureka/,http://192.168.190.130:8762/eureka/
instance:
prefer-ip-address: true
修改完之后,也需要重新build,重新部署一下:
至于config的高可用这里就不演示了,因为config也属于一个服务,只需要部署多个config注册到eureka上就可以实现高可用了
构建product服务
这一小节我们来部署product服务,首先需要修改配置文件,将mysql、rabbitmq的地址都改为线上容器能够连接的地址,注意,必须是确认是能够连接到的地址,否则product服务是启动不了的。修改bootstrap.yml文件内容如下:
spring:
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: dev
application:
name: product
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/
instance:
prefer-ip-address: true
修改远程git仓库上的product-dev.yml文件内容如下:
spring:
application:
name: product
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: password
url: jdbc:mysql://192.168.190.129:3306/springcloud_sell?characterEncoding=utf-8&useSSL=false
jpa:
show-sql: true
rabbitmq:
host: 127.0.0.1
port: 5672
username: username
password: password
与之前的过程类似,在product项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:
FROM hub.c.163.com/library/java:8-alpine
MAINTAINER zeroJun xxx@example.com
ADD sell_product-server/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
然后将代码push到git仓库上,到服务器上,拉取代码并编写shell脚本build 及上传docker镜像:
[root@01server ~]# cd /tmp
[root@01server /tmp]# git clone git@gitee.com:Zero-One/product.git
...
[root@01server /tmp]# cd product/
# 因为order服务需要用到product服务里的client模块所以需要安装一下
[root@01server /tmp/product]# mvn clean package -Dmaven.test.skip=true install
[root@01server /tmp/product]# vim build_product.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/product .
docker push hub.c.163.com/zerojun/product
[root@01server /tmp/product]# sh ./build_product.sh
...
[root@01server /tmp/product]#
镜像推送完成后,记得需要将访问权限设置为公开的,如下:
镜像准备好后,到rancher上,部署服务:
如果你的product服务,需要通过域名访问外网服务的话,记得进入容器中手动配置一下DNS解析地址:
# vi /etc/network/resolv.conf
nameserver 218.2.135.1
nameserver 202.102.24.35
或设置容器的网络:
部署成功:
通过浏览器测试接口成功:
构建order服务
构建完product服务后,这一小节我们来部署order服务,首先需要修改配置文件,将mysql、rabbitmq、zipkin的地址都改为线上容器能够连接的地址,注意,必须是确认是能够连接到的地址,否则order服务是启动不了的。修改bootstrap.yml文件内容如下:
spring:
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: dev
application:
name: order
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/
instance:
prefer-ip-address: true
修改远程git仓库上的product-dev.yml文件内容如下:
spring:
application:
name: order
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: password
url: jdbc:mysql://192.168.190.130:3306/springcloud_sell?characterEncoding=utf-8&useSSL=false
jpa:
show-sql: true
rabbitmq:
host: 127.0.0.1
port: 5672
username: username
password: password
redis:
port: 6379
host: 127.0.0.1
stream:
bindings:
myMessageOutput:
group: order
content-type: application/json
zipkin:
base-url: http://127.0.0.1:9411/
sender:
type: web
sleuth:
sampler:
probability: 1
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
circuitBreaker:
enabled: true
requestVolumeThreshold: 10
sleepWindowInMilliseconds: 10000
errorThresholdPercentage: 60
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: basic
hystrix:
enabled: true
logging:
level:
org.springframework.cloud.openfeign: debug
env:
dev
在order项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:
FROM hub.c.163.com/library/java:8-alpine
MAINTAINER zeroJun xxx@example.com
ADD sell_order-server/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
然后将代码push到git仓库上,到服务器上,拉取代码并编写shell脚本build 及上传docker镜像:
[root@01server ~]# cd /tmp/
[root@01server /tmp]# git clone git@gitee.com:Zero-One/order.git
...
[root@01server /tmp]# cd order/
[root@01server /tmp/order]# vim build_order.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/order .
docker push hub.c.163.com/zerojun/order
[root@01server /tmp/order]# sh ./build_product.sh
...
[root@01server /tmp/order]#
镜像推送完成后,记得需要将访问权限设置为公开的,如下:
镜像准备好后,到rancher上,部署order服务:
部署成功:
通过postman测试接口成功:
构建api-gateway
构建完order服务后,最后我们来部署api-gateway服务,首先需要修改配置文件,将redis、rabbitmq的地址都改为线上容器能够连接的地址,注意,必须是确认是能够连接到的地址,否则api-gateway服务是启动不了的。修改bootstrap.yml文件内容如下:
spring:
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: dev
application:
name: api-gateway
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/
instance:
prefer-ip-address: true
修改远程git仓库上的api-gateway-dev.yml文件内容如下:
spring:
application:
name: api-gateway
redis:
port: 6379
host: 127.0.0.1
rabbitmq:
host: 127.0.0.1
port: 5672
username: username
password: password
zuul:
# 全局忽略敏感头
sensitive-headers:
host:
connect-timeout-millis: 10000
socket-timeout-millis: 60000
routes:
yourProduct:
path: /myProduct/**
serviceId: product
ignored-patterns:
- /**/buyer/product/listForOrder
ribbon:
ReadTimeout: 30000
SocketTimeout: 30000
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 62000
在api-gateway项目的根目录中,创建一个Dockerfile文件,编辑文件内容如下:
FROM hub.c.163.com/library/java:8-alpine
MAINTAINER zeroJun xxx@example.com
ADD target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
[root@01server ~]# cd /tmp/
[root@01server /tmp]# git clone git@gitee.com:Zero-One/api-gateway.git
...
[root@01server /tmp]# cd api-gateway/
[root@01server /tmp/api-gateway]# vim build_aip-gateway.sh
#!/bin/bash
mvn clean package -Dmaven.test.skip=true
docker build -t hub.c.163.com/zerojun/api-gateway .
docker push hub.c.163.com/zerojun/api-gateway
[root@01server /tmp/api-gateway]# sh ./build_aip-gateway.sh
...
[root@01server /tmp/api-gateway]#
镜像推送完成后,记得需要将访问权限设置为公开的,如下:
镜像准备好后,到rancher上,部署api-gateway服务:
部署成功:
测试接口成功:
到此为止,我们就通过Docker和Rancher完成了整个微服务项目的部署。
- 程序实现下载文件或者打开文件
- VisualTreeHelper
- Linux下路由配置梳理
- Gitlab利用Webhook实现Push代码后的jenkins自动构建
- db4o 7.4 for .net3.5试用手记
- JQuery笔记(五) 圆角表格的效果
- tomcat内存溢出问题记录
- 微信小程序开放 Wi-Fi、NFC 连接能力,未来可直接刷地铁?
- 2017奇葩机器人大盘点:Sophia想生孩子,Atlas后空翻,贝佐斯骑高达
- silverlight:分享一个不错的自定义布局CollectionFlow(可用于制作相册的哦!)
- 无法取得ConnectionSettings的问题
- DataTable,List去重复记录的方法
- Uploadify的一点总结
- 自动驾驶时代,中国移动要以怎样的姿势进入?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- [Jmeter]---JsonPath表达式提取响应&断言
- envoy filter 开发实践系列 2:官网 http filter 示例编译测试
- 快速入门ElasticSearch
- 如何用 JS 一次获取 HTML 表单的所有字段 ?
- Docker与容器
- Go 每日一库之 air
- Go 每日一库之 goquery
- 个人电脑也做做宏基因组玩玩
- windows 安装 miniconda3 +jupyter lab ,使用系统R语言
- Mysql获取数据的总行数count(*)很慢
- 并发编程问题为什么都很诡异
- 6轮Jmeter压测对比keep-alive的影响
- 多个你不知道的 CSS 居中方案!
- 深入理解Pod(二)
- JavaScript 中 10 个需要掌握基础的问题