概述

  首先声明,本文是学习总结类型的博客内容,如有雷同纯属学习。本位主要结合zookeeper和dubbo做个简单实例。目前来说,一般网站架构随着业务的发展,逻辑越来越复杂,数据量越来越大,交互越来越多之后的常规方案演进历程。

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

Dubbo主要处理服务,约束服务提供者和消费者之间的关系。Dubbo处理消费者、提供者以及注册的关系如下:

Zookeeper使用

  ZooKeeper 虽然是一个针对分布式系统的协调服务,但它本身也是一个分布式应用程序。ZooKeeper 遵循一个简单的客户端-服务器模型,其中客户端 是使用服务的节点(即机器),而服务器 是提供服务的节点。ZooKeeper 服务器的集合形成了一个 ZooKeeper 集合体(ensemble),这里简单记录Zookeeper使用;

  下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper 下载之后,解压发现里面有双击zkServer.cmd(Window双击即可,Linux则需要zkServer.sh)启动zookeeper。默认打开是2181端口,双击zkCli.cmd(Window环境下)启动客户端测试下服务端。在客户端可以输入常用的zookeeper指令:

、显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
、显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
、创建文件,并设置初始内容 create [-s] [-e] path data acl 其中-s或-e分别指定节点特性,顺序或临时节点,若不指定,则表示持久节点;
acl用来进行权限控制。举例使用如下: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
、获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
、修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
、删除文件: delete /zk 将刚才创建的 znode 删除
、退出客户端: quit
、帮助命令: help

  当然也可以通过,客户端管理软件查询当前zookeeper的使用情况。下载:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip   ;解压缩后点击ZooInspector\build\zookeeper-dev-ZooInspector.jar   点击左上角的绿色按钮,输入ZK Server的地址和端口,连接成功后就能看到ZK的节点数据信息。

代码编写

Parent编码

定义Parent公用项目,里面的pom.xml内容如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.</modelVersion> <groupId>com.justin</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging> <name>parent</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5..RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-</project.build.sourceEncoding>
<dubbo-spring-boot>1.0.</dubbo-spring-boot>
</properties> <dependencies>
<!-- Spring Boot Dubbo 依赖 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>${dubbo-spring-boot}</version>
</dependency>
<!-- Spring Boot Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- Spring Boot Test 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

定义公用的实体

package com.justin.dubbo.domain;

import java.io.Serializable;

public class City implements Serializable {

    private static final long serialVersionUID = -1L;

    /**
* 城市编号
*/
private Long id; /**
* 省份编号
*/
private Long provinceId; /**
* 城市名称
*/
private String cityName; /**
* 描述
*/
private String description; public City() {
} public City(Long id, Long provinceId, String cityName, String description) {
this.id = id;
this.provinceId = provinceId;
this.cityName = cityName;
this.description = description;
} public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public Long getProvinceId() {
return provinceId;
} public void setProvinceId(Long provinceId) {
this.provinceId = provinceId;
} public String getCityName() {
return cityName;
} public void setCityName(String cityName) {
this.cityName = cityName;
} public String getDescription() {
return description;
} public void setDescription(String description) {
this.description = description;
} @Override
public String toString() {
return "City{" +
"id=" + id +
", provinceId=" + provinceId +
", cityName='" + cityName + '\'' +
", description='" + description + '\'' +
'}';
}
}

定义公用的接口

package com.justin.dubbo.service;

import com.justin.dubbo.domain.City;

public interface CityService {
public City findCityByName(String cityname);
}

Provider服务提供者代码

实现公用接口

package com.justin.dubbo.serviceimpl;

import com.justin.dubbo.domain.City;
import com.justin.dubbo.service.CityService; import com.alibaba.dubbo.config.annotation.Service; @Service(version = "1.0.0")
public class CityServiceImpl implements CityService {
public City findCityByName(String cityname) {
return new City(1L,2L,"温岭","是我的故乡");
}
}

主程序

@SpringBootApplication
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!Start Service......" );
SpringApplication.run(App.class); }
}

Application.properties内容

## Dubbo 服务提供者配置
#应用名称
spring.dubbo.application.name=provider
#注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#协议名称
spring.dubbo.protocol.name=dubbo
#协议端口
spring.dubbo.protocol.port=20880 #服务类包目录
spring.dubbo.scan=com.justin.dubbo.serviceimplCus服务提供者代码

Customer消费者调用服务代码

调用服务代码项

import com.alibaba.dubbo.config.annotation.Reference;
import com.justin.dubbo.MyCityService.MyServiceCity;
import com.justin.dubbo.domain.City;
import com.justin.dubbo.service.CityService;
import org.springframework.stereotype.Component; @Component
public class CityServiceImpl implements MyServiceCity
{
@Reference(version = "1.0.0")//调用服务项
private CityService cityService; @Override
public void printCity() {
String cityName="温岭";
City city=cityService.findCityByName(cityName);
System.out.println(city.toString());
}
}

主程序

import com.justin.dubbo.MyCityService.MyServiceCity;
import com.justin.dubbo.serviceimpl.CityServiceImpl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext; /**
* Hello world!
*
*/
@SpringBootApplication
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" ); ConfigurableApplicationContext run= SpringApplication.run(App.class,args);
MyServiceCity cityService = run.getBean(CityServiceImpl.class);
cityService.printCity();
}
}

配置application.properties内容

## 避免和 server 工程端口冲突
server.port= ## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=com.justin.dubbo.service

参考文章

Zookeeper介绍

Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例

从头开始搭建一个dubbo+zookeeper平台

实例源码:   DEMO下载

IDEA上创建 Maven SpringBoot + zookeeper +dubbo 实例的更多相关文章

  1. IDEA上创建 Maven SpringBoot项目发布到Tomcat

    概述 上篇记录了IDEA上创建Maven SpringBoot+mybatisplus+thymeleaf 项目,但是如何将SpringBoot发布到Tomcat,直接采用Maven 命令Clear- ...

  2. IDEA上创建 Maven SpringBoot+mybatisplus+thymeleaf 项目

    概述 在WEB领域,Java也是在不断的探索和改进,从开始的JSP--->Struts1--->Struts2+Spring--->Spring MVC--->SpringBo ...

  3. IntelliJ IDEA上创建maven Spring MVC项目

    IntelliJ IDEA上创建Maven Spring MVC项目 各软件版本 利用maven骨架建立一个webapp 建立相应的目录 配置Maven和SpringMVC 配置Maven的pom.x ...

  4. SpringBoot集成dubbo实例

    项目总览图: 最下面有项目的pom,具体内容: 项目运行注意事项: 先启动 provider, 将providers.xml中 port 先修改为20187 执行test目录 下的DubboProvi ...

  5. 【maven】在idea上创建maven多模块项目

    参考:https://www.cnblogs.com/wangmingshun/p/6383576.html 一:创建父项目 (1)idea引导页 (2)创建父项目,不需要选择maven插件 (3)完 ...

  6. springboot+Zookeeper+Dubbo入门

    最近想学习dubbo,就利用周末写了一个特别简单的demo,不知道有没有用,先记录一下. 1.安装zookeeper并启动(安装看我上一篇博客https://www.cnblogs.com/huang ...

  7. IDEA快速创建Maven+SpringBoot项目时:Cannot download https://start.spring.io;Status:403

    先展示一下我遇到的问题: 用浏览器搜索是有页面的,但是但是但是呢,用IDEA快速构建的时候就报403 咳咳!巴格虐我万千遍,我待技术如初恋... 我看到的解决办法有以下两种,当然,我只想说:" ...

  8. 【MAVEN】如何在Eclipse中创建MAVEN项目

    目录结构: contents structure [+] 1,Maven简介 2,Maven安装 2.1,下载Maven 2.2,配置环境变量 2.3,测试 3,Maven仓库 3.1,Maven仓库 ...

  9. 创建Maven project 提示pom.xml 首行错误

    背景 使用eclipse创建Maven SpringBoot 2.2.0 项目时报错,更换springboot 版本也不行,排除框架依赖原因.然后别人的eclipse创建的同样2.2.2 maven项 ...

随机推荐

  1. docker基础维护命令

    docker images显示当前存在的images docker ps,显示当前的container docker rm containerId 删除指定的container(需要先停止,才能删除) ...

  2. Vs2010项目升级到Vs2015时的一些修改

    之前的C++/cli项目, Civil 3D版本为2014, 现在需要升级到2018版, 在升级的过程中遇到了一些问题: 为了备忘, 记录如下: Vcproj文件中进行了一些修改, 为了跟多版本项目的 ...

  3. AssetBundle打包

    为热更新打基础(xlua\tolua) 素材.源码链接:http://www.sikiedu.com/course/74/task/1812/show 一.AssetBundle的定义和作用 1,As ...

  4. 2.2 collection 模块

    2.2.1 定义命名元祖 2.2.2 定义双端队列 2.2.3 定义有序的字典 2.2.4 定义有默认值的字典

  5. CodeForces 868F Yet Another Minimization Problem(决策单调性优化 + 分治)

    题意 给定一个序列 \(\{a_1, a_2, \cdots, a_n\}\),要把它分成恰好 \(k\) 个连续子序列. 每个连续子序列的费用是其中相同元素的对数,求所有划分中的费用之和的最小值. ...

  6. 「POJ2891」Strange Way to Express Integers【数学归纳法,扩展中国剩余定理】

    题目链接 [VJ传送门] 题目描述 给你\(a_1...a_n\)和\(m_1...m_n\),求一个最小的正整数\(x\),满足\(\forall i\in[1,n] \equiv a_i(mod ...

  7. purge旧的ubuntu 的linux内核

    https://www.sysgeek.cn/remove-old-kernels-ubuntu-16-04/

  8. wiki

    GRANT ALL PRIVILEGES ON confluence.* TO 'confluence'@'localhost' IDENTIFIED BY '%SaRK%TDpU#CyT6i';

  9. PKUWC2019爆0记

    PKUWC2019爆0记 访问量该骗的还是要骗. 1.20 坐了一天的高铁到jz了,热的一批 1.21 上午开营仪式 下午day1 打开发现有个地主斗 然后开T1 出题人你™搞笑吧放一道sb都能切的题 ...

  10. Codeforces Round #553 (Div. 2)

    传送门 A. Maxim and Biology 题意: 给出一个串s,问最少需要多少步操作使得串s包含"ACTG"这个子串,输出最少操作次数: 题解: 枚举每个位置 i,求出将 ...