基于容器微服务的PaaS云平台设计(一) 实现容器微服务和持续集成
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://www.cnblogs.com/SuperXJ/
前言:关于什么是容器微服务PaaS和容器微服务PaaS的优劣,我找了下这篇不错可以参考 http://www.sohu.com/a/152360962_198222。本文致力于一步一步构建一个最简单的基于容器的微服务的PaaS云平台,先从简单的核心功能开始,慢慢深入全部主要功能和加入高可用和容错等非功能设计,争取做到麻雀虽小,五脏俱全。本连载的总体技术架构路线是微服务、PaaS平台和devops,这应该(至少目标)是一个完整的Paas云平台解决方案,最终目标是实现自动化、智能化开发测试部署和运维(例如通过AI实现运维智能化,故障自动处理、处理策略机器学习,无论运维设备规模如何增长,每个领域的运维只需要2-3个人)。微服务决定采用spring cloud,平台架构采用docker、kubernetes、zabbix、ansible、elk、openshift、SDS(没想好实现到什么程度,先列着吧),devops采用robot、jenkins等,很多内容我也没想好想明白,边写变做边补充边修改吧,回头补一张总体架构图更直观,不足和错误之处也请批评。
第一篇主要写一下最核心的cloud spring微服务实现、容器部署和jenkins持续集成,用最简单的例子把一个微服务架构设计实现,和微服务的自动化集成部署到容器流程跑通。
一、微服务
采用spring cloud实现微服务,包括eureka server(用于微服务注册发现心跳等) 、eureka client(用户实现微服务) 、feign(用于微服务的Load Balance)、zuul(服务网关,用户入口、过滤器),另外还有Kafka、配置中心、断路、服务容错、限流等等模块,由于不是最基础的,所以后文再说。
基础环境:window7 、jdk1.7 、IntelliJ IDEA 本机IP 192.168.1.109 (简单说明一下,我的实验环境就是一台4G内存的笔记本,安装的win7,然后在里面建了一个centos7的虚机IP为192.168.1.110,win7主要用户微服务IDEA环境的程序编写编译,centos主要用于devops和docker相关的运行)
1.1、创建eureka server (前面详细一点描述,后面的都简单说明)
EurekaApplication.java中加入如下代码,申明这是一个eureka server:
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
Pom.xml中加入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
资源文件 application.properties中加入如下代码,申明eureka server信息,包括服务端口、主机名、有不自己不注册自己、服务URL:
server.port=8761
eureka.instance.hostname=localhost
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
OK,eureka服务端创建完毕,编译运行后,可以启动 http://192.168.1.109:8761 查看
可以看到这个时候,还没有instances,也就是还没有微服务注册。
1.2、创建eureka client 并完成注册(eureka client实现微服务,真实应用中里面放入程序逻辑和数据库访问并对外提供接口,注意服务需要是无状态)
前面和创建eureka差不多,建好之后在主程序中加入:
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestParam;
@SpringBootApplication
//重要:申明这是一个eureka client
@EnableEurekaClient
@RestController
public class DemoApplication {
//从配置文件中读取server.port,从URL中读取关键字MicroServiceA,返回前端this MicroServiceA port is 8762
@Value("${server.port}")
String port;
@RequestMapping("/MicroServiceA")
public String home() {
return "this MicroServiceA port is:" +port;
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
配置文件: 申明server地址,微服务名称和端口
eureka.client.serviceUrl.defaultZone=http://192.168.1.109:8761/eureka/
spring.application.name=MicroService_A
server.port=8762
完成打开http://192.168.1.109:8762/MicroServiceA,显示
然后刷新一下eureka server注册中心http://192.168.1.109:8761,看看微服务是否注册成功了。
看到了application中有了一个刚才创建的微服务 MICROSERVICE_A。
1.3 创建feign微服务负载均衡
1、创建工程的时候加入feign和eureka server依赖
程序入口处加入@EnableFeignClients 开启feign服务
2、配置文件
eureka.client.serviceUrl.defaultZone=http://192.168.1.109:8761/eureka/
spring.application.name=Feign_Service
server.port=8764
3、增加并定义一个接口
@FeignClient(value = "MicroService_A") //表面调用的是微服务MicroService_A。
public interface SchedualServiceHi {
@RequestMapping(value = "/MicroServiceA",method = RequestMethod.GET)); //URL传入的对象是 MicroServiceA
}
将前面创建的eureka client 启动两次,端口为8762和8763,这两个client形成了一个最小集群,通过feign调度,做负载均衡。
输入 http://192.168.1.109:8764/MicroServiceA 多次刷新
结果会交替出现 this MicroServiceA port is:8762 、this MicroServiceA port is:8763 表面feign负载均衡策略生效。
1.4 创建zuul
1、 main中加入
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
@EnableZuulProxy //申明是一个zuul服务网关
@EnableEurekaClient
2、配置文件中加入
eureka.client.serviceUrl.defaultZone=http://192.168.1.109:8761/eureka/ //向eureka server注册
spring.application.name=zuul_service
server.port=8765
//定义了两个服务 apia和apib ,对用户暴露了这两个服务。
zuul.routes.apia.path=/apia/**
zuul.routes.apia.serviceId=MicroServiceA
zuul.routes.apib.path=/apib/**
zuul.routes.apib.serviceId=Feign_Service
3 、启动zuul服务,同时确保之前的eureka client 和 fenign都已经启动并在注册中心注册,如下图:
4 、最终用户访问 http://192.168.1.109:8765/apia/MicroServiceA ,即首先到服务网关zuul,然后zuul将用户请求转到微服务MicroServiceA,然后微服务MicroServiceA返回用户结果,如下图:
服务网关没有做集群部署,如果做集群部署,建议前面可以加上F5或者HAPROXY做负载均衡。
二、微服务在Docker容器部署
基础环境:centos7 、jdk1.8 docker1.12.5(centos7自带docker,怎么安装不说了)、maven3.0 本机IP 192.168.1.110 ,docker 需要启动。关闭selinux和iptables、
2.1 将上面的eureka server容器化
创建工程,将上面win7 eurekaserver工程整个目录直接copy到centos /root/下
其中pom.xml文件参考上面eureka server,唯一不同是加入插件docker-maven-plugin和配置如下(有说明),其他都一样就不累述了。
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.3</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName> //docker image name
<dockerDirectory>src/main/docker</dockerDirectory> //dockerfile path
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
2.2 构建可执行文件
- 运行 mvn package ,会生成如下jar包
确认一下是否OK,运行 java -jar docker_eureka_server-0.0.1-SNAPSHOT.jar,在192.168.1.109 的windows 上输入http://192.168.1.110:8761/ 会显示出eureka_server的主页面如下图,说明构建成功:
2.3 docker中运行jar包
1、创建vi src/main/docker/dockerfile内容如下
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp //docker中创建tmp
ADD eureka-server-0.0.1-SNAPSHOT.jar app.jar
#RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] //执行app.jar
EXPOSE 8761 //docker服务端口
2、运行docker build -t xiong:rureka docker 或者 mvn package docker:build 创建镜像,如下图(为了规范命名,我将前面工程名重建了):
3运行3、容器 docker run -p 8761:8761 0 -d xiong:reruka 将容器的8761端口映射到linux主机的8761端口
4、测试一下 http://192.168.1.100:8761 显示了eureka server的主页,表示一个eureka server容器运行成功(实际生产中,建议一个容器中运行一个进程或者说一个微服务)
三 、CI
利用jenkins做持续集成,实验环境还是上面的centos,jdk1.7 、svn server,关闭iptabls和selinux,IP 192.168.1.110
3.1 首先安装jenkins,很简单,增加一个jenkins的YUM源,然后yum -y install jenkins,修改端口为8080、启动 service jenkins start,修改为开机自启动, 访问 http://192.168.1.110:8080,输入admin和密码(由于我不知道默认密码,做了密码重置),显示如下:
3.2 配置svn
1、jenkins中安装svn相关插件
2、创建版本库svnadmin create /root/svnrepos
3、配置用户名密码权限等,不累述
4、将上一节的 eurekaserver整个工程目录加入 svn: svn import /root/eurekaserver/ file:///root/svnrepos/eurekaserver/ -m svneureka.out
5、启动svn svnserve -d -r /root/svn/repos
6、测试一下,在win7上svn客户端上输入地址 svn://192.168.1.110,会自动将centos下eurekaserver工程目录下载到win7中,证明svn OK.
3.3、利用jenkins 实现持续集成eurekaserver工程,每次svn提交代码时就会自动集成和并部署docker微服务。
1、访问http://192.168.1.110:8080 jenkins主页新增一个svn的插件,然后新建任务,选择自由风格,取名为resukaserver,配置源为SVN,这里有一个坑,会报错unable to access to repository,解决方法可参考
http://blog.csdn.net/benkaoya/article/details/48683269 ,大概思路就是在Jenkins所在服务器访问一次SVN版本库并保存身份认证信息。
3.3.1构建中增加svn和 Execute shell内容如下,同时增加自动任务,每次提交代码时候进行集成和部署:
注意:1、默认是jenkins用户,所以需要加上环境变量。 2、docker需要root用户运行。
测试一下,jenkins上点击立刻构建,结果如下:
说明:有个报错,需要将原来的eurekaservicer kill掉再运行新编译的,懒得改了。知道就行。
自动构建和部署完成,访问 http://192.168.1.110:8761 确认微服务启动成功。
至此,只要程序员在svn中commit了新的代码,本程序就会自动编译并运行该微服务并启动对外提供服务。
未完待续………
基于容器微服务的PaaS云平台设计(一) 实现容器微服务和持续集成的更多相关文章
- 基于容器微服务的PaaS云平台设计(二)通过kubernetes实现微服务容器管理
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 ,博主地址:http://www.cnblogs.com/SuperXJ/ 上一章描述了基于spring cloud的微服务实例(实 ...
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...
- Docker容器技术的PaaS云平台架构设计***
基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ...
- EasyDarwin开源流媒体云平台设计与实现(分布式+负载均衡)
前言 早在2013年我就设计了一套架构非常简单的分布式流媒体服务器平台<基于Darwin实现的分布式流媒体直播服务器系统>,当时的考虑如今看来有诸多的细节点没有考虑到:1.CMS是单点部署 ...
- OpenStack-Ocata版+CentOS7.6 云平台环境搭建 —9.块存储服务(cinder)部署配置
块存储服务部署相关块存储服务(cinder)为实例提供块存储.存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的.还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等.典型 ...
- 如何给SAP云平台的账号分配Leonardo机器学习服务的实例
首先点击Entitlements下面的Service Assignments,查看是否有SAP Leonardo Machine Learning Foundation这个服务: 点击SubAccou ...
- PAAS云服务平台
云计算是一种可以方便.按需从网络訪问的.可配置的.共享的资源池(如网络.server.存储.应用程序和服务)模型,且仅仅需最少的管理(服务提供方交互)就可以高速供应和公布该模型. 云计算平台的核心部分 ...
- 容器云平台使用体验:DaoCloud
容器技术风起云涌,在国内也涌现出了很多容器技术创业公司,本文介绍容器厂商DaoCloud提供的容器云平台,通过使用容器云平台,可以让大家更加了解容器,并可以学习不同容器云平台的优势. 1. ...
- SAAS云平台搭建札记: (一) 浅论SAAS多租户自助云服务平台的产品、服务和订单
最近在做一个多租户的云SAAS软件自助服务平台,途中遇到很多问题,我会将一些心得.体会逐渐分享出来,和大家一起探讨.这是本系列的第一篇文章. 大家知道,要做一个全自助服务的SAAS云平台是比较复杂的, ...
随机推荐
- BZOJ 2457 双端队列
Sherry 现在碰到了一个棘手的问题,有N个整数需要排序. Sherry 手头能用的工具就是若干个双端队列. 她需要依次处理这 N 个数,对于每个数, Sh ...
- php7 中?? 和 ?:的区别
$b = $a?? $c ;相当于$b= isset($a)?$a:$c; $b = $a?: $c ;则是 $b = !empty($a) ? $a:$c;
- Q438 找到字符串中所有字母异位词
给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引. 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100. 说明: ...
- shell (3) 磁盘挂载
#!/bin/sh disk=`df -h |grep /dev/sd|awk '{print $1}'` echo $disk for d in $disk do echo $d uuid=`blk ...
- Dev中gridControl修改列为按钮
(1)点击Run Designer (2)点击要修改的列,把列的ColumnEdit属性设置为RepositoryItemButtonEdit (3)把TextEditStyle属性设置为HideTe ...
- # js设置键名和键值de坑
js设置键名和键值 let obj1 = {'jifeng': 60, 'lilu': 59, 'hongyan': 51, 'donghan': 4, 'liudan': 18, 'liuhaiya ...
- ionic3打包打包安卓apk详细过程以及遇到的问题
1.jdk和sdk的安装以及环境变量配置参考打包详解 上述连接已经从下载安装jdk以及sdk的环境变量配置到打包的流程以及很详细了.但是在我自己安装打包的过程中遇到了这篇文章中没有遇到的问题,下面图文 ...
- npm全局安装和局部文件安装区别
全局安装往往是安装一个工具,他不是安装在一个文件夹下,而是安装在某个全局环境下,如目前我的安装路径是: C:\Users\cvter\AppData\Roaming\npm 在这里,我们可以看到所有全 ...
- Starting vsftpd for vsftpd: [FAILED]问题的解决
问题描述 [root@bigdatamaster etc]# rpm -qa| grep vsftpd vsftpd--.el6.x86_64 [root@bigdatamaster etc]# [r ...
- Mac OS terminal终端常用命令
基础概念 OS X 采用的Unix文件系统,所有文件都挂在跟目录“ /” 下面,所以不在要有Windows 下的盘符概念.比如什么“C:”你在桌面上看到的硬盘都挂在 /Volumes 下.比如接上个叫 ...