使用的平台语言JAVA
:1.8
第一步:开发
java 项目
每个系统分为三个模块(gradle项目)
api
用于存放consumer
与provider
共用实体类
consumer
SpringBoot
项目
主要功能
1.RESTFul对外接口访问。
2.包含限流,断路器,幂等请求等。
cat build.gradle 核心配置
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version")
}
}
apply plugin: 'org.springframework.boot'
jar {
String buildDir = project.buildDir
manifest {
attributes (
"Main-Class": "com.dounine.demo.Application",//main主函数加载入口
"Class-Path": new File(buildDir+'/libs/lib').list().collect { "lib/${it}" }.join(" ")//为了打成jar包,不把全部包都打进一个包里面
)
}
}
task copyJars(type:Copy) {
from configurations.runtime
into new File('build/libs/lib') // 目标位置
}
compileJava.dependsOn copyJars
def env = hasProperty("pro")?"pro":(hasProperty("dev")?"dev":null)//用于打包线上环境
sourceSets {
main {
resources {
srcDirs = ["src/main/resources", "src/main/profile/$env"]
}
}
}
开发完成使用gradle打包命令
gradle build -Ppro -xtest #打包两次
provider
与数据库或逻辑操作
cat build.gradle 核心配置
jar {
String buildDir = project.buildDir
manifest {
attributes (
"Main-Class": "com.bjike.goddess.ticket.Application",//main主函数加载入口
"Class-Path": new File(buildDir+'/libs/lib').list().collect { "lib/${it}" }.join(" ")
)
}
}
task copyJars(type:Copy) {
from configurations.runtime
into new File('build/libs/lib') // 目标位置
}
compileJava.dependsOn copyJars
def env = hasProperty("pro")?"pro":(hasProperty("dev")?"dev":null)
sourceSets {
main {
resources {
srcDirs = ["src/main/resources", "src/main/profile/$env"]
}
}
}
存储
可将mysql或者其它数据库等做成一个容器运行在Rancher网络中,访问通过容器名称访问即可
第二步:上传
将已经打包好在项目中的build/libs/
里面的所有文件上传
将打包好的项目上传到自己的gitlab搭建的平台,防止配置文件数据外漏。
consumer
项目上传之前先处理掉重复的jar包
7z d ls | grep .jar$ BOOT-INF/lib #使用7z的命令将jar包中的重复jar包删除
git add .
git commit -m "xxx"
git push
第三步:使用Rancher管理docker集群一键部署
在某一个台Docker主机上新增一个容器,境像为java
挂载的目录为/root:/root
容器重启即可部署最新打包项目
cat /root/docker/deploy.sh
#!/bin/bash
if [ ! -d $project ];then
git clone http://$user:$password@xxx.xxx.com:10080/$user/$project.git #克隆私有部署项目
cd $project
else
cd $project
git pull
fi
if [ "$commit" != "" ];then #部署指定版本
git checkout $commit
else #部署最新版本
git checkout master
fi
java -jar `ls | grep *.jar` #运行java项目
服务内部通讯使用Rancher提供的ipsec网络,根据容器的名称做为IP地扯通讯。
如何解决域名统一访问服务consumer或者node
使用nginx
在某台宿主主机上部署一个nginx容器
//泛解析配置如下
server {
listen 80; //可访问node程序
server_name ~^(?<subdomain>.+)\.xxx\.xxx\.com$;
access_log off;
location / {
set $node "-node";
client_max_body_size 100m;
resolver 169.254.169.250;//rancher网络DNS地扯
proxy_pass http://$subdomain$node;//容器名称跟域名相对如:user-node项目对应的域名就是user.xxx.com
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 8080;//用来访问consumer
server_name ~^(?<subdomain>.+)\.xxx\.xxx\.com$;
access_log off;
location / {
set $consumer "-consumer";
client_max_body_size 20m;
resolver 169.254.169.250;//rancher网络DNS地扯
proxy_pass http://$subdomain$consumer:8080;//项目名称跟域名一样如:user项目对应的域名就是user.xxx.com
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
在宿主主机再装一个nginx服务[可选]
server {
listen 80;//前端页面端口
server_name *.xx.xx.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443;
server_name *.xx.xx.com;
ssl on;
ssl_certificate /etc/nginx/ssls/xx.xxx.com.crt;
ssl_certificate_key /etc/nginx/ssls/xxx.xx.com.key;
location / {
client_max_body_size 20m;
proxy_pass http://10.42.1.1;//nginx容器ip地扯
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
server {
listen 8080;//用来测试consumer
server_name *.xx.xx.com;
location / {
client_max_body_size 20m;
proxy_pass http://10.42.1.1:8080;//nginx容器ip地扯
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
如何往Rancher集群添加一台Docker主机
新增一台主机运行第一次安装脚本
#!/bin/sh
source /etc/profile
yum install git -y
cd /root
git clone https://github.com/nd-team/docker.git
cd docker
bash docker-install.sh #将docker安装写成脚本
systemctl start docker
systemctl enable docker
sudo docker run -d --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.1 http://xxxxxx:7777/v1/scripts/79578F2CC50344FB776D:1483142400000:lTyVH6kebwBnAGdGZS2artrVRP8 #执行Rancher主机添加