Posted in Working Skills, 技术

Dubbo实战一:快速入门 [译]

本文根据https://github.com/alibaba/dubbo 的README,然后实战操作记录如下:

一、简介

Dubbo不单单只是高性能的RPC调用框架,更是SOA服务治理的一种方案。

核心:

1. 远程通信,向本地调用一样调用远程方法。

2. 集群容错

3. 服务自动发现和注册,可平滑添加或者删除服务提供者。

二、快速入门

环境:Maven,git,jdk

1. 克隆dubbo开源项目

  1. cd ~
  2. git clone https://github.com/alibaba/dubbo.git

2. Maven编译项目

  1. cd ~/dubbo
  2. mvn clean install -Dmaven.test.skip ## 跳过测试

下面核心点有:zookeeper作为注册中心(服务订阅和发布依托于注册中心)、服务生产者(提供服务)项目、服务生产者(提供服务)项目和监控Web项目。

过程如下:

3. 下载启动zk

  1. cd ~
  2. ## 下载解压
  3. wget http://www.apache.org/dist//zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz
  4. tar zxvf zookeeper-3.3.3.tar.gz
  5. ## 启动
  6. cd ../bin
  7. ./zkServer.sh start

下面项目遇到target目录中编译好的项目为xxx.tar.gz。请自行用下面命令解压:

  1. tar zxvf XXX.tar.gz

4. 启动服务消费者

  1. cd ~/dubbo/dubbo-demo/dubbo-demo-consumer/target/dubbo-demo-consumer-2.5.4-SNAPSHOT/conf
  2. vim dubbo.properties
  3.    - edit: dubbo.registry.adddress=zookeeper://127.0.0.1:2181 ## 更改注册中心为zk
  4. cd ../bin
  5. sh ./start.sh

5. 启动服务生产者

  1. cd ~/dubbo/dubbo-demo/dubbo-demo-provider/target/dubbo-demo-provider-2.5.4-SNAPSHOT/conf
  2. vim dubbo.properties
  3.   - edit: dubbo.registry.adddress=zookeeper://127.0.0.1:2181
  4. cd ../bin
  5. sh ./start.sh

其实到这里已经o了,可以打开生产者消费者项目的log进行查看:

  1. ## 打开消费者的log
  2. cd dubbo-demo-consumer/target/dubbo-demo-consumer-2.5.4-SNAPSHOT/logs
  3. tail -f dubbo-demo-consumer.log

熟悉的Hello,World的案例coming…

6. 启动监控Web项目

  1. cd ~/dubbo/dubbo-simple/dubbo-monitor-simple/target/dubbo-monitor-simple-2.5.4-SNAPSHOT/conf
  2. vim dubbo.properties
  3.    - edit: dubbo.registry.adddress=zookeeper://127.0.0.1:2181
  4. cd ../bin./start.sh
  5. ## 浏览器访问
  6. http://127.0.0.1:8080

可以在监控中看到消费者,生产者实例等信息

Posted in Working Skills, 技术

Git 备忘录

设置相关

设置用户姓名和邮箱:

git config --global user.name "Your Name”
git config --global user.email "email@example.com”

常用指令

克隆远程库到本地

git clone

将本地目录变成Git管理的仓库

git init

将文件添加到仓库

git add 'filename'

将文件提交到仓库

git commit -m "说明"

显示工作区的状态

git status

从上一个git status看出哪些文件被修改,则查看修改内容

git diff 

显示提交的日志

git log
git log --graph // 可以方便看出分支合并图

回滚到版本,也可以将工作区的回滚到暂存区

git reset
git reset --hard 'commitid' // HEAD指向当前版本

回滚工作区的修改

git checkout -- 'filename'

主要考虑工作区,暂存区和仓库之间的操作:

git add files //把当前文件放入暂存区域。
git commit //给暂存区域生成快照并提交。
git reset -- files //用来撤销最后一次git add files,你也可以用git reset 撤销所有暂存区域文件。
git checkout -- files //把文件从暂存区域复制到工作目录,用来丢弃本地修改。

image

关于分支 远程库待续。。。

Posted in Java, 技术

图解微服务架构演进

图解服务化架构演进

许久没摘记了,继续告诫自己:

要静下心来,低调多做事

前言

来自dubbo的用户手册中的一句话:
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

常规的垂直应用架构就相当于传统的那种,现阶段传统垂直架构改造的核心就是对应用做服务化改造,服务话改造使用的核心技术架构就是分布式服务框架。

其实这篇是概念上的总结,技术概念软文,纪录此文让自己更明白什么是微服务化架构。

服务化架构演进

请看下图,也来自dubbo的用户手册,图中恰恰少了微服务架构的图。
image

那什么是微服务架构呢?
先从第一个图中第一个说起吧。

1.orm – 单一应用架构

我认为是一个高内聚版本,所有功能部署在一起。数据访问框架(orm)成为关键。这个架构很少被人使用,几乎接近灭绝了吧。

优点:成本低,适合功能少又简单 缺点:很多,比如无法适应高流量,二次开发难,部署成本高

2.mvc架构 - 垂直应用架构

当访问量渐渐增大,慢慢演化成用的很多的mvc架构。虽然还是所有的功能都是部署在同一个进程中,但是可以通过双机或者前置负载均衡来实现负载分流。这样应用也可以拆分成不同的几个应用,以提升性能和效率。

此时,mvc架构用于分离前后端逻辑。一方面,有一定的模块化。另一方面,加速和方便了开发。

3.rpc架构 - 分布式服务架构

当mvc垂直应用分成不同应用时,越来越多的情况下。不可避免的事应用a与应用b之间的交互。此时将核心和公共的 业务功能抽出来,作为单独的服务,并实现前后端逻辑分离。

此时则就需要提高业务的复用及整合的分布式rpc框架,例如dubbo等。

4.soa架构 - 流动计算架构

当rpc架构中的服务越来越多时,服务的生命周期的管控,容量的评估等各种问题会出现,使服务化成为瓶颈。需要增加一个调度中心来进行对服务管控,监督等。

然后,提到关键的 --

5.微服务架构

问:什么是微服务架构?

答:它就是将功能分散到各个离散的服务中然后实现对方案的解耦。服务更原子,自治更小,然后高密度部署服务。

下面是对微服务架构的图解:

image

小结

伴随敏捷开发,持续交付,DevOps,Docker等高速发展,微服务必然是未来演进方向。加油~ 多了解吧。

Posted in Working Skills, 技术

Mac使用zsh后, mvn命令无效的解决方案

Mac使用zsh后, mvn命令无效的解决方案

问题:

这里使用了zsh + iterm2 的配置
1.我配置好maven后,也source ~/.bash_profile。此时,我mvn -v 使是生效的。

2.问题就来了,我new了个窗口出来。mvn -v无效了。

解决:

将以下针对mvn的配置,放到.zshrc 中

export M2_HOME="/opt/maven" export PATH="$PATH:$M2_HOME/bin"export MAVEN_OPTS="-Xmx512m"

重启终端就可以了。
后来某大神说
在l.zshrc里加上source .bash_profile

Posted in Java, 技术

google collection工具包的MapMaker使用

 

摘自网上描述语段:

Google Collections中的MapMaker融合了Weak Reference线程安全高并发性能异步超时清理自定义构建元素等强大功能于一身。

常阅读优秀源代码的童鞋都知道,一般叫Maker的对象都是Builder模式,而这个MapMaker就是来”Build“Map的.

一、google collection工具包的MapMaker使用:

public static void main(String[] args) {
        /**
         * expiration(3, TimeUnit.SECONDS)设置超时时间为3秒
         */
        ConcurrentMap<String , String> map = new MapMaker().concurrencyLevel(32).softKeys().weakValues()
                .expiration(3, TimeUnit.SECONDS).makeComputingMap(
                        /**
                         * 提供当Map里面不包含所get的项,可以自动加入到Map的功能
                         * 可以将这里的返回值放到对应的key的value中
                         */
                        new Function<String, String>() {
                            public String apply(String s) {
                                return "creating " + s + " -> Object";
                            }
                        }
                );

        map.put("a","testa");
        map.put("b","testb");

        System.out.println(map.get("a"));
        System.out.println(map.get("b"));
        System.out.println(map.get("c"));

        try {
            // 4秒后,大于超时时间,缓存失效。
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(map.get("a"));
        System.out.println(map.get("b"));
        System.out.println(map.get("c"));
    }

结果如下:

testa
testb
creating c -> Object
creating a -> Object
creating b -> Object
creating c -> Object

 

二、先看下其api的相关demo片段:

// 使用案例:存储验证码
    // <String, String> == <用户唯一,验证码>
    // expiration(15, TimeUnit.MINUTES) 有效期15分钟
    ConcurrentMap<String,String> capthcaMap = new MapMaker().expiration(15, TimeUnit.MINUTES).makeMap();

    // 设置ConcurrentMap的concurrencyLevel参数 ,例如ConcurrentHashMap是用来控制其Segment数组的大小
    ConcurrentMap<String,Object> map1 = new MapMaker().concurrencyLevel(8).makeMap();

    // 构造各种不同reference作为key和value的map
    ConcurrentMap<String,Object> map2 = new MapMaker().softKeys().weakValues().makeMap();

    // 提供当Map里面不包含所get的项,可以自动加入到Map的功能
    ConcurrentMap<String,Integer> map3 = new MapMaker()
            .makeComputingMap(
                    new Function<String, Integer>() {
                        public Integer apply(String key) {
                            return 1;
                        }
                    }
            );

可以看出过了4秒后,缓存失效,所以呈现如此结果。

Posted in Java, 技术

五、网站高可用架构

Writer      :BYSocket(泥沙砖瓦浆木匠)

2016年的书 — A Year Of Books


高可用架构

    主要手段:数据和服务的冗余备份及失效转移。

42b04b4f-0228-44e1-b0a0-9a6db3392de2

负载均衡通过心跳检测监控服务器不可用。

其机制,实现服务器可用实时监控,自动转移,心跳检测。利用负载均衡

906507aa-df96-4723-ba5c-fbbd7379d290

Session集群

1.Session复制

78d9fa72-eca3-4345-885e-e6560a254126

2. Session绑定

利用负载均衡的源地址Hash算法实现。

649f979a-b05e-45ee-a0cc-f546637ed0c7

3. 利用Cookie记录Session

3269f531-2bb7-4a15-bc9c-785683dff255

4.Session服务器

667425fb-2216-4704-9e23-39072659f52b

Posted in Java, 技术

四、瞬时响应:网站的高性能架构

Writer      :BYSocket(泥沙砖瓦浆木匠)

2016年的书 — A Year Of Books

网站性能指标:响应时间吞吐量

网站性能测试

    不同视角下的网站性能

    用户视角的网站性能

    前端架构优化手段,通过优化页面HTML样式,利用浏览器的并发和异步特性,调整浏览器缓存策略,使用CDN服务,反向代理等手段。

    缓存加快数据读取,集群提高吞吐能力,异步消息加快请求响应及实现削峰

    建设优化骨干网,使用高性能服务器

测试指标

    响应时间,并发数,吞吐量(TPS QPS),性能计数器

前端性能优化

    1. 减少HTTP请求:合并css,合并js合并图片

    2. 使用浏览器缓存:HTTP头 Cache-Control 和 Expires

    3. 启用压缩:HTML CSS JS — GZip

    4. css 放在页面上面 js放在页面下面

    5. 减少Cookie传输

系统上层,三步走吧:缓存集群异步

分布式缓存架构

    JBoss Cache更新同步

b16e039d-8390-4f12-966c-2c547be393c7

    Memcached互不通信

9f36ed3f-63e0-4932-9775-46b3b00998d0

异步操作

1f20a927-c7da-47ec-a0ca-b28494de0b2a

代码级别

    1.多线程 : IO CPU

    2.资源复用

    3.数据结构

    4.GC

B+树

LSM树

HFDSb20a2432-ac65-4c08-92dd-c4702330ff27

5bb90e42-7b1d-4541-95ba-caa8e4c8ffec

acf281f2-92a1-4275-99f7-497cd8f10a8d

Posted in Java, 技术

三、大型网站核心架构要素

Writer      :BYSocket(泥沙砖瓦浆木匠)

2016年的书 — A Year Of Books


软件架构,有关软件整体架构与组件的抽象描述,用于指导大型软件系统各个方面的设计。

性能

    在浏览器端通过浏览器缓存页面压缩,合理布局页面,减少Cookie传输等改善性能。

    CDN反向代理服务器,缓存热点文件

    应用服务端,本地缓存分布式缓存(缓存的主从备份热备份

    代码层,多线程和改善内存管理

    数据库服务端,索引缓存SQL优化

可用性

    网站可用的主要的手段是冗余。多台服务器数据多台互相备份,任何一个宕机都不会影响应用的整体可用。

    对应用服务器,多台服务器通过负载均衡组成一个集群共同对外服务

    对于存储服务器,由于其上存储着数据,需要数据进行实时备份

    发布验证,自动化测试,自动化发布,灰度发布

伸缩性

    伸缩性是指通过增加服务器,缓解不断上升的用户并发访问和不断增加

    改进缓存路由算法保证缓存数据的可访问性

扩展性

   如何设计网站的架构使用其能快速的响应需求变化

    网站可扩展性架构主要手段:事件驱动架构分布式服务

安全性

    安全架构是保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。

小结

    性能,可用性,伸缩性,扩展性和安全性是网站架构最核心的几个要素。