dubbo+ zookeeper-2018

1、Dubbo 
开源分布式服务框架
Spring 无缝集成
 
dubbo.io  gitHub 
 
dubbo 用户手册 
可以学习
 
1、学习任何一个框架,
首先— 要知道他的应用场景,
然后— 配置的该怎么配,代码书写的应该怎么写
最后— 重点框架 要知道细节原理
 
一、背景
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行
 

单一应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
 

垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
 

分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
 

流动计算架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
 
二、基本需求的驱动
当服务越来越多时,服务 URL 配置管理变得非常困难,F5 硬件负载均衡器的单点压力也越来越大。 此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。
 
当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。 这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。
 
接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器? 为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化
 
三、架构(牢记)
 
节点角色说明
节点 角色说明
Provider 服务提供方、生产者
Consumer 服务消费方、消费者
Registry 注册中心
Monitor 统计调用次数监控中心
Container 服务运行容器
调用关系说明
  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
 
 
四、Zookeeper (注册中心)
 
主要用来dubbo 的 注册中心
 
五、dubbo发布服务Hello world
Github 下载 dubbo 软件包
 
1、创建一个空的 maven 包,创建 pom.xml 依赖文件。
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.java1234</groupId>
  <artifactId>dubbo-demo-provider</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.46</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.0.35.Final</version>
        </dependency>
    </dependencies>
</project>
 
 
 
2、创建 DemoProviderService 和 DemoProviderServiceImpl 
 
package com.java1234.service;
 
public interface DemoProviderService {
 
    public String sayHello(String name);
}
 
package com.java1234.service.impl;
 
import com.java1234.service.DemoProviderService;
 
public class DemoProviderServiceImpl implements DemoProviderService{
 
    public String sayHello(String name) {
        return “hello world";
    }
}
 
3、在 resource 创建  dubbo-demo-provider.xml
 
<?xml version="1.0" encoding="UTF-8"?>
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 
    <!-- 提供方应用名称,用于计算依赖关系 -->
    <dubbo:application name="demo-provider" />
    
    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
    
    <!-- 使用dubbo协议,在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880"/>
    
    <!-- service实现类作为本地的一个bean -->
    <bean id="demoProviderService" class="com.java1234.service.impl.DemoProviderServiceImpl"/>
    
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.java1234.service.DemoProviderService" ref="demoProviderService"/>
 
</beans>
 
4、测试
 
import java.io.IOException;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class ProviderTest {
 
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-demo-provider.xml"});
        context.start();
        System.out.println(“hello world 暴露服务的方法");
        try {
            System.in.read();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } // press any key to exit
        context.close();
    }
}
 
六、dubbo Admin 管理服务器
 
放到 tomcat 目录下的 webapps
 
启动 dubbo 的时候也要启动 zookeeper ,不然就会 一直报错。 
 
 
七、消费dubbo 服务
 
创建 maven 仓库的时候可以 用 jar 的形式
 
1、创建 pom.xml 
 
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.java1234</groupId>
  <artifactId>dubbo-demo-consumer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.6.0</version>
    </dependency>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.10</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.46</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
    </dependency>
    <dependency>
        <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.0.35.Final</version>
        </dependency>
    </dependencies>
</project>
 
 
2、创建 dubbo-demo-consumer.xml 
 
<?xml version="1.0" encoding="UTF-8"?>
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 
    <!-- 消费方应用名称,用于计算依赖关系,不是匹配条件,不要与提供方名称一样  -->
    <dubbo:application name="demo-consumer"/>
 
    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
 
    <!-- 生成远程服务代理,可以与本地bean一样使用  check属性,启动时候是否检查 一般设置成false 启动时候不检查 -->
    <dubbo:reference id="demoProviderService" check="false" interface="com.java1234.service.DemoProviderService"/>
 
</beans>
 
 
3、创建 调用服务
 
package com.java1234.service;
 
public interface DemoProviderService {
 
    public String sayHello(String name);
}
 
4、编码测试
 
import java.io.IOException;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.java1234.service.DemoProviderService;
 
public class ConsumerTest {
 
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-demo-consumer.xml"});
 
        context.start();
 
        DemoProviderService demoProviderService=(DemoProviderService) context.getBean("demoProviderService”);
 
        String result=demoProviderService.sayHello("hello”);
 
        System.out.println(“hello"+result);
        try {
            System.in.read();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        context.close();
    }
}
 
八、接口抽取及依赖版本统一
 
九、dubbo服务集群实现负载均衡
 
一天的注册量几十万,
 
 
 
 
 
posted @ 2021-12-15 17:13  养柱  阅读(69)  评论(0)    收藏  举报