IDEA上创建 Maven SpringBoot + zookeeper +dubbo 实例
概述
首先声明,本文是学习总结类型的博客内容,如有雷同纯属学习。本位主要结合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
参考文章
Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
实例源码: DEMO下载
IDEA上创建 Maven SpringBoot + zookeeper +dubbo 实例的更多相关文章
- IDEA上创建 Maven SpringBoot项目发布到Tomcat
概述 上篇记录了IDEA上创建Maven SpringBoot+mybatisplus+thymeleaf 项目,但是如何将SpringBoot发布到Tomcat,直接采用Maven 命令Clear- ...
- IDEA上创建 Maven SpringBoot+mybatisplus+thymeleaf 项目
概述 在WEB领域,Java也是在不断的探索和改进,从开始的JSP--->Struts1--->Struts2+Spring--->Spring MVC--->SpringBo ...
- IntelliJ IDEA上创建maven Spring MVC项目
IntelliJ IDEA上创建Maven Spring MVC项目 各软件版本 利用maven骨架建立一个webapp 建立相应的目录 配置Maven和SpringMVC 配置Maven的pom.x ...
- SpringBoot集成dubbo实例
项目总览图: 最下面有项目的pom,具体内容: 项目运行注意事项: 先启动 provider, 将providers.xml中 port 先修改为20187 执行test目录 下的DubboProvi ...
- 【maven】在idea上创建maven多模块项目
参考:https://www.cnblogs.com/wangmingshun/p/6383576.html 一:创建父项目 (1)idea引导页 (2)创建父项目,不需要选择maven插件 (3)完 ...
- springboot+Zookeeper+Dubbo入门
最近想学习dubbo,就利用周末写了一个特别简单的demo,不知道有没有用,先记录一下. 1.安装zookeeper并启动(安装看我上一篇博客https://www.cnblogs.com/huang ...
- IDEA快速创建Maven+SpringBoot项目时:Cannot download https://start.spring.io;Status:403
先展示一下我遇到的问题: 用浏览器搜索是有页面的,但是但是但是呢,用IDEA快速构建的时候就报403 咳咳!巴格虐我万千遍,我待技术如初恋... 我看到的解决办法有以下两种,当然,我只想说:" ...
- 【MAVEN】如何在Eclipse中创建MAVEN项目
目录结构: contents structure [+] 1,Maven简介 2,Maven安装 2.1,下载Maven 2.2,配置环境变量 2.3,测试 3,Maven仓库 3.1,Maven仓库 ...
- 创建Maven project 提示pom.xml 首行错误
背景 使用eclipse创建Maven SpringBoot 2.2.0 项目时报错,更换springboot 版本也不行,排除框架依赖原因.然后别人的eclipse创建的同样2.2.2 maven项 ...
随机推荐
- 【BZOJ2876】【Noi2012】骑行川藏 拉格朗日乘法
题目描述 给你 \(n,E,s_i,k_i,v_i'\),要求在 \[ \sum_{i=1}^nk_i{(v_i-v_i')}^2s_i\leq E \] 的前提下最小化 \[ \sum_{i=1}^ ...
- <数据结构基础学习>(四)链表 Part 2
一.使用链表实现栈 增,删,查只对链表头进行操作,时间复杂度都为O(1) 链表头作为栈顶 LinkedListStack<E> implements Stack<E> publ ...
- Codeforces 1082C Multi-Subject Competition(前缀+思维)
题目链接:Multi-Subject Competition 题意:给定n名选手,每名选手都有唯一选择的科目si和对应的能力水平.并且给定科目数量为m.求选定若干个科目,并且每个科目参与选手数量相同的 ...
- [TJOI2015]概率论
[TJOI2015]概率论 史上最短黑题 看起来一脸懵逼,没有取模,1e-9 根据期望定义,发现 分母是一个卡特兰数,,,,不能直接算 所以考虑怎么消掉一些东西 gn表示n个点的叶子个数和,fn表示n ...
- RBAC权限管理设计
一.权限简介 1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么 ...
- c/c++学习系列之memset()函数
[转载] memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *mems ...
- 【C#】判断字符串中是否包含指定字符串,contains与indexof方法效率问题
#方法一:使用string.Contains方法 string.Contains是大小写敏感的,如果要用该方法来判断一个string是否包含某个关键字keyword,需要把这个string和这个key ...
- linux下安装与配置Redis
1.安装 (1)获取源代码 wget http://download.redis.io/releases/redis-4.0.8.tar.gz (2)解压 tar xzvf redis-4.0.8.t ...
- .NET面试题系列(十七)前端面试
JavaScript js如何实现继承 CSS 行内元素和块状元素的区别 CSS让2个DIV在同一行显示的解决方法 在CSS中,div属于块级元素,每个块级元素默认占一行高度,一行内添加一个块级 ...
- Linux常用命令大全(非常全!!!)
Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短 ...