帆的博客

扬帆起航

配置中心和服务注册中心

我们先把配置中心和服务注册中心跑起来,这个先照着之前的教程做,很简单没什么变动。
就是git仓库需要密码的话加入下面的配置就好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server:
port: 8888

eureka:
instance:
hostname: configserver
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http://${config.host:192.168.99.100}:8761/eureka/

spring:
cloud:
config:
server:
git:
uri: yourgiturl
password: ****
username: ****

这里的${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就把它的几乎整个微服务框架栈开源贡献给了社区,这些框架和组件包括

  • Eureka: 服务注册发现框架
  • Zuul: 服务网关
  • Karyon: 服务端框架
  • Ribbon: 客户端框架
  • Hystrix: 服务容错组件
  • Archaius: 服务配置组件
  • Servo: Metrics组件
  • Blitz4j: 日志组件

Netflix的开源框架组件已经在Netflix的大规模分布式微服务环境中经过多年的生产实战验证,正逐步被社区接受为构造微服务框架的标准组件。Pivotal去年推出的Spring Cloud开源产品,主要是基于对Netflix开源组件的进一步封装,方便Spring开发人员构建微服务基础框架。对于一些打算构建微服务框架体系的公司来说,充分利用或参考借鉴Netflix的开源微服务组件(或Spring Cloud),在此基础上进行必要的企业定制,无疑是通向微服务架构的捷径。

Spring Cloud是微服务工具包,为开发者提供了在分布式系统的配置管理、服务发现、断路器、智能路由、微代理、控制总线等开发工具包。

觉得挺不错的,就找找资料尝试实战一下。
在此记录和回顾一下过程中遇到的问题和实际项目中需要解决的一些问题。

阅读全文 »

我这里用docker来做持续集成的思路和jenkins和tomcat的持续集成是一样的。都是用jenkins拉取git的代码然后打war包,只不过重启tomcat步骤换成了docker的重启。
直接展示一下docker的脚本吧。

阅读全文 »

今天来说一下如何用jenkins做持续集成。
jenkins我这里就不介绍了,重点介绍一下如何用jenkins对tomcat进行持续集成。

思路

流程是这样的:

  1. jenkins从git(or svn)拉取代码,进行构建。
  2. 将打出来的war包用jenkins的插件(Publish over SSH)传到你要部署的服务器。
  3. 执行一个shell脚本,将正在运行的tomcat进程kill掉,把war包拷到tomcat目录的webapps下。然后在运行${TOMCAT_DIR}/bin/startup.sh。
阅读全文 »

枚举

我们在写程序的时候会遇到这种需求。就是我的对象里面有一个属性是一个枚举值,但是mybatis默认是不支持的,官方提供了一个typeHandler可以用枚举的ordinal()来进行存和取的自动转换。把它配置在
mybatis-configuration.xml里。

1
2
3
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.xxx.user.UserType"/>
</typeHandlers>
阅读全文 »

先试试把开环境用docker来部署。

http://docs.docker.com/engine/installation/centos/
直接按照这里安装就可以了,不过我在这里遇到了一点问题。
我是centos6.5,内核在 3.8 以上
通过以下命令查看您的 CentOS 内核:

uname -r

如果执行以上命令后,输出的内核版本号低于 3.8,请参考下面的方法来来升级您的 Linux 内核。

对于 CentOS 6.5 而言,内核版本默认是 2.6。首先,可通过以下命令安装最新内核:

1
2
3
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
yum -y --enablerepo=elrepo-kernel install kernel-lt

随后,编辑以下配置文件:

1
vi /etc/grub.conf

default=1修改为default=0

阅读全文 »

转载: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这两个实现。

自定义RequestCondition
  • 实现RequestCondition接口
1
2
3
4
5
6
7
8
9
10
package org.springframework.web.servlet.mvc.condition;

import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;

public interface RequestCondition<T> {
T combine(T other);
T getMatchingCondition(HttpServletRequest request);
int compareTo(T other, HttpServletRequest request);
}
  • 继承RequestMappingHandlerMapping
    • getCustomTypeCondition方法根据对应的Handler类返回类级别的condition
    • getCustomMethodCondition方法根据对应的Handler方法返回方法级别的condition
阅读全文 »
0%