提示:要直接看搭建例子的可以跳到 三

一.项目架构的发展

传统的mvc架构项目将整个系统功能实现全部写在一个项目中,部署在一个机器上,随着用户量的增涨,单个项目服务器无法承受暴增的用户请求时需要增加服务器数量,并通过负载均衡集群将项目部署到多个服务器上,提高项目可处理的用户请求总数。

当mvc架构项目中的某个或某几个模块的用户请求量较大,其他模块用户请求量较小,此时负载均衡集群依然是每个服务器部署一个完整的项目,实际需要进行负载均衡的仅是用户请求量较大的几个模块,此处则可采用分布式将系统功能模块服务化。

在项目过于庞大,部署单项目无法满足需求时,需要将项目的不同功能模块拆分成单独的服务项目部署到不同的服务器上(也就是分布式)。

在分布式中,各个服务项目之间要进行相互调用,需要在知道地址的情况下通过网络进行访问。此时需要一个能让所有服务都能得知其他服务地址的中间人,由此产生了服务注册中心,服务项目需要告诉服务注册中心它是干嘛的,也就是进行服务注册,

当其他项目要调用特定服务时可以到服务注册中心查找服务项目的地址,获取到服务项目地址后即可通过网络地址自行调用该服务项目,这整个过程涉及的结构也就是rpc架构的内容。

rpc架构:

包含服务提供者、服务消费者、服务注册中心;

服务注册中心:在服务提供者进行服务注册时保存服务提供者信息,在服务消费者进行服务发现时返回服务提供者地址;

服务提供者provider:在服务注册中心进行服务注册,等待服务消费者调用;

服务消费者consumer:在服务注册中心进行服务发现,在得到服务注册中心返回的服务提供者地址后进行服务调用;

rpc架构缺点:当项目拆分服务过多时无法得知服务是否正在被谁使用;

soa服务化架构:在rpc架构的基础上加了服务治理系统;

二.Zookeeper与Dubbo分别是什么?各自在项目中充当什么角色?

Zookeeper是什么:

Apache ZooKeeper是由集群(节点组)使用的一种服务,用于在自身之间协调,并通过稳健的同步技术维护共享数据。ZooKeeper本身是一个分布式应用程序,为写入分布式应用程序提供服务。

zookeeper充当的角色:

在上述rpc架构中zookeeper就是一个服务注册中心,所有的服务都在zookeeper中进行登记(服务注册),当某个服务要调用其他服务时,问zookeeper要该服务的网络地址(服务发现)。

dubbo是什么:

Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

dubbo充当的角色

rpc架构的系统中所有服务项目都需要进行服务注册(告诉服务注册中心我是谁)与服务发现(告诉服务注册中心我要找谁),服务提供者和服务消费者(也就是服务本身)可使用dubbo来负责服务注册与服务发现。

dubbo对rpc架构缺点的处理:

Dubbo提供了dubbo-admin服务治理系统,在搭建dubbo+zookeeper后可运行dubbo-admin系统进行服务管理,也就从rpc架构变成了soa服务化架构。

 三.搭建dubbo+zookeeper小例子

在正式搭建前可以先安装并启动zookeeper(略),随后安装dubbo-admin,下载dubbo-admin.war,改名ROOT.war,放到tomcat中,启动后可修改其中的dubbo.properties,将地址和账号密码修改成你安装的zookeeper的,随后重启项目

dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

然后可以访问localhost:8080(修改为ROOT.war就是为了能localhost:8080直接访问项目),登录dubbo-admin后可以进去逛逛

在搭建到步骤3或步骤4时可以启动项目,然后到dubbo-admin服务管理系统中查看消费者和提供者是否有对应的数据,可以此为依据,判断服务是否注册成功。

1.创建maven项目,并在项目中创建三个子项目,service项目用于编写公共服务接口,dubboProvider去实现service中的接口,dubboConsumer用于调用公共服务接口在dubboProvider中的实现

2.在service项目中新增一个接口:

package com.lwl.service;

public interface DemoService {

    String sayHello(String name);
}

3.dubboProvider中的操作:

3-1)在dubboProvider项目的pom.xml中加入依赖

        <!--公共服务接口依赖-->
<dependency>
<groupId>com.lwl</groupId>
<artifactId>service</artifactId>
<version>1.0</version>
</dependency>
<!--dubbo依赖 https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.10</version>
<!-- 排除dubbo依赖自带的spring和netty依赖,防止自带的依赖与项目内依赖版本冲突,如果本身项目没有,无需排除 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zkclient依赖 https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
<!--dubbo自身的spring相关依赖被排除,此处将dubbo所需要的对应依赖引入-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>

3-2)创建DemoServiceImpl 类,实现公共服务接口

package com.lwl.service.impl;

import com.lwl.service.DemoService;

public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}

3-3)在web.xml中配置启动spring

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5"> <!-- 启动spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> </web-app>

3-4)在applicationContext.xml中

<?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:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--启动扫描-->
<context:component-scan base-package="com.lwl.service"/>
<!--声明公共服务接口实现类的bean-->
<bean id="demoService" class="com.lwl.service.impl.DemoServiceImpl"/>
<!--dubbo:application:提供方的应用名-->
<dubbo:application name="dubbo-provider"/>
<!--dubbo:registry:注册中心的类型和地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" check="false" subscribe="false" register=""/>
<!--dubbo:protocol:这个服务要暴露在哪个端口上(使用方根据这个端口使用服务)-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--dubbo:service:设置暴露的服务接口,ref 为该接口的 bean,timeout 为超时时间-->
<dubbo:service interface="com.lwl.service.DemoService" ref="demoService" timeout="600000"/> </beans>

4.在dubboConsumer项目中的操作:

4-1)在dubboConsumer项目的pom.xml文件添加依赖:

<!--公共服务接口依赖-->
<dependency>
<groupId>com.lwl</groupId>
<artifactId>service</artifactId>
<version>1.0</version>
</dependency>
<!--dubbo依赖 https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.10</version>
<!-- 排除dubbo自带的spring和netty,使用项目的包,如果本身项目没有则无需排除 -->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zkclient依赖 https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency> <!-- SpringMVC: https://mvnrepository.com/artifact/org.springframework/spring-webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.8.RELEASE</version>
    </dependency>

4-2)在web.xml中启动springmvc

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5"> <!-- SpringMVC核心控制器 -->
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

4-3)在spring-mvc.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 注解探测器-->
<context:component-scan base-package="com.lwl.controller"/>
<context:annotation-config/> <!--dubbo:application: 使用方的应用名-->
<dubbo:application name="dubbo-consumer"/>
<!--dubbo:registry:注册中心的类型和地址-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" check="false"/>
<!--dubbo:reference:要使用的服务的接口,并将返回的注入 bean,名称为id设的值-->
<dubbo:reference interface="com.lwl.service.DemoService" id="demoService"/> <!-- 注册注解驱动 -->
<mvc:annotation-driven/> </beans>

4-4)创建controller:

package com.lwl.controller;

import com.lwl.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController
public class DemoController { // @Autowired
// 默认按byType自动注入,当找不到对应类型的bean时才按byName自动注入,都找不到时抛出异常
// 默认情况下必须要求依赖对象必须存在,如果要允许null值可使用@Autowired(required=false)
// @Resource
// 默认按byName自动注入,找不到时抛出异常
@Resource//或使用@Autowired(required = false)
private DemoService demoService; @GetMapping("/{name}")
public String get(@PathVariable String name) {
return demoService.sayHello(name);
} }

5.先启动dubboProvider项目,随后启动dubboConsumer项目,启动后访问http://localhost:8080/dubboConsumer/** 返回  Hello **   则配置成功

dubbo+zookeeper示例记录的更多相关文章

  1. Dubbo+Zookeeper实现简单的远程方法调用示例

    1. Dubbo介绍 示例代码:Github 1.1 RPC Remote Procedure Call:远程过程调用 1.2 Dubbo架构 Subscribe 订阅:签署:赞成 Monitor 监 ...

  2. dubbo+zookeeper+springboot简单示例

    目录 dubbo+zookeeper+springboot简单示例 zookeeper安装使用 api子模块 生产者producer 消费者consumer @(目录) dubbo+zookeeper ...

  3. 关于dubbo+zookeeper微服务的一些认识记录

    借鉴架构示意图: 实例介绍: 公司某项目架构 服务器A:nginx 服务器BC:tomcat1.tomcat2 服务器D:Dubbo+zookeeper 服务器EF:db1+zookeeper.db2 ...

  4. Java代码搭建Dubbo+ZooKeeper 的示例

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  5. dubbo + zookeeper 环境搭建

    一.zookeeper windows部署 1.下载安装 到官网下载解压版后解压至F:\server\zookeeper-3.4.8,剩下为文件配置工作: 2.本地伪集群 1) 在F:\server\ ...

  6. 精华【分布式、微服务、云架构、dubbo+zookeeper+springmvc+mybatis+shiro+redis】分布式大型互联网企业架构!

    平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis ...

  7. 分布式架构真正适用于大型互联网项目的架构! dubbo+zookeeper+springmvc+mybatis+shiro+redis

     分类: 分布式技术(3)    目录(?)[+]   平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成D ...

  8. 搭建SpringBoot+dubbo+zookeeper+maven框架(二)

    上一篇文章是关于搭建SpringBoot+dubbo+zookeeper+maven框架的,但是里面的功能还不够完善,今天就日志管理方面做一些改善. 下了demo的网友可能会发现项目在启动时会有警告: ...

  9. dubbo系列二、dubbo+zookeeper+dubboadmin分布式服务框架搭建(windows平台)

    一.zookeeper配置中心安装 1.下载安装包,zookeeper-3.4.6.tar.gz 2.解压安装包,修改配置文件 参考zookeeper-3.4.6/conf/zoo_sample.cf ...

随机推荐

  1. elasticsearch 开机自启

    linux下开机自启: 在/etc/init.d目录下新建文件elasticsearch 并敲入shell脚本: #!/bin/sh #chkconfig: #description: elastic ...

  2. js 遍历树的层级关系的实现

    1.遍历树的层级关系 1)先整理数据 2)找到id和数据的映射关系 3)然后找到父节点的数据,进行存储 test() { const list = [ { id: ", parentId: ...

  3. springcloud源码解析(目录)

    springcloud是一个基于springboot的一站式企业级分布式应用开发框架.springboot为其提供了创建单一项目的便利性,springcloud组合了现有的.常用的分布式项目的解决方案 ...

  4. template中实现加减乘除数学运算

    django模板只提供了加法的filter,没有提供专门的乘法和除法运算:django提供了widthratio的tag用来计算比率,可以变相用于乘法和除法的计算. # 加法{{value|add:1 ...

  5. [技术翻译]您应该知道的13个有用的JavaScript数组技巧

    本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...

  6. Tomcat安装及环境配置

    欢迎任何形式的转载,但请务必注明出处. 本章内容 安装 环境变量入口 三个系统变量配置 测试安装配置是否成功 安装之前请安装jdk并进行环境配置(点击进入jdk教程) 一.安装 点击进入官网下载 二. ...

  7. How to change SAPABAP1 schema password In HANA

    Symptom How to change SAPABAP1 schema password Environment HANA 1.x HANA 2.x Resolution Shutdown the ...

  8. K2 BPM_【解决方案】从“制造”到“智造”,K2推动制造业转型升级_业务流程管理系统

    近年来,中国制造业产出占全球总产品比例越来越大,是仅次于美国的全球第二大工业制造国,中国凭借巨大的制造业总量成为名副其实的“世界工厂”.然而个性化消费的兴起正在给制造企业各环节带来冲击.在现代市场环境 ...

  9. 【数字图像处理】gamma变换

    论文:gamma校正的快速算法及其c语言实现 gamma变换实现过程 假设图像中有一个像素,值是 200 ,那么对这个像素进行校正必须执行如下步骤: 1. 归一化 :将像素值转换为  0 - 1  之 ...

  10. node.js 微信开发1-接入

    准备工作1 域名准备 无论是个人开发还是做公司项目域名都是必不可少的 前期我个人用过花生壳做个开发测试,挺好用的,就是现在要收费了,开通花生壳要收费,开通内网穿透要收费(为啥要内网穿透呢,因为微信接入 ...