Spring Cloud项目实践(三)
持续集成
配置jenkins构建项目,自动build出docker镜像,发布到docker私库中,或者从目标服务器中启动容器。
Maven的Docker插件
http://www.cnblogs.com/skyblog/p/5163691.html 有讲到如何用Dockerfile构建,下面是采用Maven插件的方式构建,插件的文档在这里
配置jenkins构建项目,自动build出docker镜像,发布到docker私库中,或者从目标服务器中启动容器。
http://www.cnblogs.com/skyblog/p/5163691.html 有讲到如何用Dockerfile构建,下面是采用Maven插件的方式构建,插件的文档在这里
我们先把配置中心和服务注册中心跑起来,这个先照着之前的教程做,很简单没什么变动。
就是git仓库需要密码的话加入下面的配置就好。
1 | server: |
这里的${config.host:192.168.99.100}表示没有读到config.host就用192.168.99.100这个值。
1 | java -jar cloud-simple-service-1.0.0.jar --config.host=localhost |
这个用法就很灵活了,后面配合Dockerfile可以根据不同的环境来启动不同的配置。
最近看了一篇文章,了解到微服务架构的组成部分和概念,以前有看过一点dubbo,文章里介绍到Netflix这么一个公司:
Netflix是一家成功实践微服务架构的互联网公司,几年前,Netflix就把它的几乎整个微服务框架栈开源贡献给了社区,这些框架和组件包括
Netflix的开源框架组件已经在Netflix的大规模分布式微服务环境中经过多年的生产实战验证,正逐步被社区接受为构造微服务框架的标准组件。Pivotal去年推出的Spring Cloud开源产品,主要是基于对Netflix开源组件的进一步封装,方便Spring开发人员构建微服务基础框架。对于一些打算构建微服务框架体系的公司来说,充分利用或参考借鉴Netflix的开源微服务组件(或Spring Cloud),在此基础上进行必要的企业定制,无疑是通向微服务架构的捷径。
Spring Cloud是微服务工具包,为开发者提供了在分布式系统的配置管理、服务发现、断路器、智能路由、微代理、控制总线等开发工具包。
觉得挺不错的,就找找资料尝试实战一下。
在此记录和回顾一下过程中遇到的问题和实际项目中需要解决的一些问题。
我这里用docker来做持续集成的思路和jenkins和tomcat的持续集成是一样的。都是用jenkins拉取git的代码然后打war包,只不过重启tomcat步骤换成了docker的重启。
直接展示一下docker的脚本吧。
先试试把开环境用docker来部署。
http://docs.docker.com/engine/installation/centos/
直接按照这里安装就可以了,不过我在这里遇到了一点问题。
我是centos6.5,内核在 3.8 以上
通过以下命令查看您的 CentOS 内核:
uname -r
如果执行以上命令后,输出的内核版本号低于 3.8,请参考下面的方法来来升级您的 Linux 内核。
对于 CentOS 6.5 而言,内核版本默认是 2.6。首先,可通过以下命令安装最新内核:
1 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
随后,编辑以下配置文件:
1 | vi /etc/grub.conf |
将default=1修改为default=0。
之前在自己服务器上搭建服务器,这是之前的文章
gitlab安装需要注意的问题
后来在按照官网上替换自带服务器上的nginx的时候出现了一点问题。也是找了很久才找到这么一篇帖子,我在这里把nginx的部分转载过来一下。
转载:http://www.dengchuanhua.com/132.html
在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12位。
该项目地址为:https://github.com/twitter/snowflake是用Scala实现的。
python版详见开源项目https://github.com/erans/pysnowflake。
核心代码为其IdWorker这个类实现,其原理结构如下,我分别用一个0表示一位,用—分割开部分的作用:
1 | 0---0000000000 0000000000 0000000000 0000000000 0 --- 00000 ---00000 ---0000000000 00 |
在上面的字符串中,第一位为未使用(实际上也可作为long的符号位),接下来的41位为毫秒级时间,然后5位datacenter标识位,5位机器ID(并不算标识符,实际是为线程标识),然后12位该毫秒内的当前毫秒内的计数,加起来刚好64位,为一个Long型。
这样的好处是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由datacenter和机器ID作区分),并且效率较高,经测试,snowflake每秒能够产生26万ID左右,完全满足需要。
随着我们的应用后台不断的发版,因为改动导致了数据结构的变化,这个时候就需要对HTTP API进行版本控制了。对原有的客户端进行兼容,搜索一番后找到一个方法。
先看这个文章,提供了一个解决方案。
http://www.cnblogs.com/jcli/p/springmvc_restful_version.html
Spring MVC通过在方法上使用RequestMapping来确认应该使用哪个方法来响应相应的请求,而RequestMapping又通过各种RequestCondition的实现来完成各种过滤(比如:consumes,headers,methods,params,produces以及value等)。在Spring MVC框架中使用RequestConditionHolder和RequestMappingInfo这两个实现。
1 | package org.springframework.web.servlet.mvc.condition; |