zoukankan      html  css  js  c++  java
  • 从头开始搭建一个dubbo+zookeeper平台

     

    本篇主要是来分享从头开始搭建一个dubbo+zookeeper平台的过程,其中会简要介绍下dubbo服务的作用。

    •   首先,看下一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后的常规方案演进历程。

         

    •   其次,当服务越来越多之后,我们需要做哪些服务治理?

          

    •   最后,是dubbo的架构图

          
      注册中心的选择


      dubbo支持多种类型的注册中心:

    •   Multicast注册中心
    •   Zookeeper注册中心
    •   Redis注册中心
    •   Simple注册中心

      这里我们选择zookeeper,其实类型的优点缺点可详细查看文档。


      1:zookeeper的安装,还是采用docker这一招鲜的run命令来安装zookeeper

    docker run -dit --name zookeeper  --hostname  zookeeper-host  -v /data:/data -p 2181:2181 jplock/zookeeper:latest 


      2:安装zkui,可以参考zkui的项目地址来安装,它提供了一个管理界面,可以针对zookeepr的节点值进行CRUD操作,同时也提供了安全认证,按照如下几步就可以完成安装。

    •   mvn clean install,执行前需要安装java环境,maven环境,执行成功后会生成一个jar文件。
    •   将config.cfg复制到上一步生成的jar文件所在目录,然后修改配置文件中的zookeeper地址。
    •   执行 jar. ( nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar & ),注意后面的那个&,是指不退出的意思。
    •   测试,http://localhost:9090,如能看到如下页面则代表zookeeper安装运行正常。

             

            


      下面是创建dubbo服务以及使用dubbo服务的过程:

       dubbo提供者,创建一个java工程,注意以下几点:

    •  包依赖,引入如下三个主要的包就可以了,主要是spring,dubbo以及zkclient  
    <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>2.4.10</version>
                <exclusions>
                    <exclusion>
                        <artifactId>spring</artifactId>
                        <groupId>org.springframework</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.3</version>
            </dependency>
    •  定义接口,这里为了演示,简单定义了一个返回产品名称的接口。
    public interface IProduct {
        String getProductName();
    
    }
    •  接口实现 
    @Service
    public class ProductService implements IProduct{
        public String getProductName() {
           
            return "jim";
        }
    }
    •  服务启动函数
      • 加载配置文件
      • 调用context.start()
      • 执行一个不退出程序的操作,这里有很多种做法。
    public class App {
    
        private final static Logger logger = LoggerFactory.getLogger(App.class);
        public static void main(String[] args) {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                    "classpath*:applicationContext.xml");
            context.start();
    
            logger.info("dubbo service begin to start");
            try {
                System.in.read();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    •  服务配置文件,这里需要指出的是:
      • dubbo:service的定义配合了dubbo:annotation,ref="productService",是指定的一个id,实际的实现类通过注解扫描来完成的,并没有在配置文件中指定实现类,后面的消费者配置文件中会有所体现。
      • dubbo:application中,可以指定logger的实现接口。
      • dubbo:protocol中,可以指定是否启动访问日志,这个对有时排查线上问题非常有帮助。
     <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans.xsd  
            http://code.alibabatech.com/schema/dubbo  
            http://code.alibabatech.com/schema/dubbo/dubbo.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/util
            http://www.springframework.org/schema/util/spring-util.xsd"
            >
        <context:property-placeholder location="classpath*:config.properties"/>
        <dubbo:application name="jim" logger="slf4j" />
    
        <dubbo:registry protocol="zookeeper" address="192.168.21.128:2181" />
    
        <dubbo:protocol accesslog="true" name="dubbo" port="20880" />
    
        <dubbo:annotation package="jim" />
    
        <dubbo:service interface="jim.IProduct" ref="productService"/>
    
        <context:component-scan base-package="jim" />
        <import resource="redis-context.xml"/>
    
    
    </beans>

            
       dubbo消费者

        

    •    消费者配置文件,它的配置相对提供者要简单很多:
      • 指定消费者的名称,这个可以随意,不需要与提供者做任务相关联的匹配。
      • 指定协定类型,zookeeper地址。
      • 指定引用的服务接口,注意这里的id就与服务提供者定义的ref值相同。
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
        <dubbo:application name="consumer-of-jim-app"  />
    
        <dubbo:registry protocol="zookeeper" address="192.168.21.128:2181"/>
    
        <dubbo:reference interface="jim.IProduct" id="productService" />
    
    </beans>
    •    接口注解定义以及接口调用    
    @Controller
    public class HomeController {
    
        private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
        @Autowired
        private IProduct productService;
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public String home(Locale locale, Model model) {
            logger.info("Welcome home! The client locale is {}.", locale);
           
            String productName=this.productService.getProductName();
            model.addAttribute("name", productName);
    
            return "home";
        }
    
    }

      dubbo admin

      有一个UI工具可以针对dubbo服务进行管理,可惜我没有在官方文档提供的链接中下载成功,随后从其它地方虽然下载完成了,但在安装部署方面暂时遇到了一定的问题,需要手续研究解决。

        

       正常应该可以看到如下界面:

    • 管理提供者
    • 管理消费者

       

           服务治理

          

        经过上面的步骤后,就可以启动服务端以及客户端来验证了。上面只是简单的搭建了dubbo环境以及实现了一个hello world的服务接口,要想使用好dubbo还有好多提供的最佳实践,比如服务治理:

    • 本地存根
    • 本地伪装
    • 结果缓存
    • 多版本
    • 服务降级
    • ......

     本文引用:

    1. http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%A4%9A%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83
    2. http://blog.csdn.net/yinwenjie/article/details/50113139
    3. https://github.com/DeemOpen/zkui
  • 相关阅读:
    服务器状态码
    QuerySet中添加Extra进行SQL查询
    django配置一个网站建设
    MySQL数据库查询中的特殊命令
    125. Valid Palindrome
    121. Best Time to Buy and Sell Stock
    117. Populating Next Right Pointers in Each Node II
    98. Validate Binary Search Tree
    91. Decode Ways
    90. Subsets II
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/5622005.html
Copyright © 2011-2022 走看看