前言
在dubbo之前,利用SSM/SpringBoot/SSH框架来写代码, 利用的机制(从上至下,controller-service-dao-db), 但承受的人数在几万人左右,如果人数过多,性能会变差,甚至崩溃。
如果人数过亿了,用户量及其大,更适合使用dubbo(分布式架构),里面用的是集群技术,里面有好多服务器,不同的服务器对应着不同的功能。有用来生产,有用来消费 。里面的就组成了对应的Consumer和Provuder。最外面还有个监管者Monitor(监视器)。还有一个传达命令的,就是(Registry)。
附图(官方): Dubbo 【后端框架】 开源分布式服务框架: 消费者Consumer 提供者 Provider 监视器 monitor 注册中心 zookeeper Container 服务运行容器 Registry注册中心
1.什么是Dubbo
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能(通信协议 RPC),可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架, 它提供了三大核心能力:
- 面向接口的远程方法调用
- 智能容错和负载均衡
- 以及服务自动注册和发现
详细解析:
C端和p端 两个都是在服务器端的,只是分层
以前的是在一个工程里,相互之间可以依赖, 用maven管理,可以调来调去。 但现在都是单独的工程所以需要用RPC机制进行通信。 他是dubbo提供的 c 和p进行命令传递和相互调用, 用的就是注册中心机制。 zookeeper让c和p端产生关系,定义规则, p端可以有好多个(集群) c端一般不会变。
举个例子: 1.先利用dubbo实现项目架构: 搞三个服务器,如消费者(c)、注册中心(zookeeper)、提供者(p) 2.假设生产某品牌牛奶: 先找到zookeeper进行配置,制定规则,外包装和盒子的规则,通过这个规则,厂商(p)再进行批量生产这个系列牛奶(一批的接口),再通过消费者(c) 通过zookeeper告诉要喝多少牛奶,然后把需求再发送给p端,根据p对应的需求进行生产,并发送给zookeeper端,再返回给消费者(c)。还有个Monitor端,该意思是监视的作用。有错误只是反馈,不会解决。
zookeeper类似管理者 也是通讯录
2.准备环境
两个物料
- apache-tomcat-7.0.94
- zookeeper-3.4.9
1.配置并启动zookeeper
(1). 解压zookeeper,修改conf下的配置文件名称为zoo.cfg
(2). 修改配置文件中的数据存储(日志)位置
- 先新建一个zookeeper-3.4.9\repo
- 然后打开zoo.cfg,更改内容
dataDir=D:\xxx\zookeeper-3.4.9\repo之后直接运行
(dataDir=/tmp/xxx 默认都是linux的)存储日志的作用。
(3). 启动注册中心zkServer.cmd
[sh是linux启动方式 cmd是windows]
问题: 如果打开zookeeper windows闪退。
解决方法: 第一步 bin/zkEnv.cmd 第二步 zoo.cfg dataDir=D:\A\xxxx\zookeeper-3.4.9\repo 路径用双斜杠
上面那个是必开的,如何运行工程的话,
下面的可开可不开。
第三步 然后再启动
2.配置Tomat(monitor搭建坏境)
1. 注意点: 1.monitor 没有可视化界面 , 所以根据tomcat可视化界面访问monitor
2.每次编译都会重新更新 dubbo 文件 webapps / dubbo
3.tomcat里的dubbo.war 是自己加的
4.conf/server.xml 》改端口
<Connector port="8099" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2. 启动文件 startup.bat
上面的zookeeper也不能关,搭配用的。
问题: tomcat启动不起来 解决 方法 bin/setclasspath.bat set JAVA_HOME=D:\A\java\jdk set JRE_HOME=D:\A\java\jre
改为你自己的对应路径
然后就可以了
3. 测试控制台
http://localhost:8099/dubbo/ 账户 root 密码 root 说明: 上面页面用的不多 大部分是看代码 上面是monitor 很少用到 tomcat 其中zookeeper 必须启动 c和p相互串联起来。
3.创建工程及目录(分布式框架)
0.附图
1.创建工程(聚合工程)
第一步 创建maven工程,不用打勾,直接进去,并且把src删掉
第二步
- springboot工程(名字 consumer)》Java Web
- springboot工程(名字 provider)》Java Web
- maven工程> quickstart(名字 common)
实体类 模板 不用web板块
第三步 点开
2.common(公有模块)
(0)pom.xml
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
(1)entity 实体类/City
import java.io.Serializable;
public class City implements Serializable {
private Integer id;
private String cityName;
}
(2)service 定义标准/ CityService
制定规则
import cn.kgc.entity.City;
import com.github.pagehelper.PageInfo;
import java.util.List;
public interface CityService {
List<City> findAll();
PageInfo<City> findAll(Integer pageNo);
}
3.provider 提供者 生产接口
1.pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.kgc</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
2.application.yml
spring:
datasource:
url: jdbc:mysql:///db_dubbo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL
username: root
password: zjj
driver-class-name: com.mysql.cj.jdbc.Driver
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
mybatis:
configuration:
call-setters-on-nulls: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:mapper/*.xml
dubbo:
application:
name: provider
注册到zk中的名称
registry:
address: zookeeper://127.0.0.1:2181
zk的地址
scan:
base-packages: cn.kgc.service
扫描哪些包中的哪些业务暴露出去 (dubbo的@Service注解对应包的位置)
protocol:
name: dubbo
port: 21881
提供者暴露服务的端口号 默认端口号 21880
server:
port: 8083
3.cn.kgc.mapper/CityMapper
import cn.kgc.entity.City;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface CityMapper {
List<City> findAll();
}
4.resources/mapper/CityMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kgc.mapper.CityMapper">
<select id="findAll" resultType="cn.kgc.entity.City">
select * from city
</select>
</mapper>
5.cn.kgc.service/ serviceImpl 说明:(摘录)
1. @Service 用的dubbo的注解,表明这是一个分布式服务 目前有两个包有@Service注解: com.alibaba.dubbo.config.annotation.Service: 用于标注对外暴露的dubbo接口实现类。 org.springframework.stereotype.Service: 用于标注根据业务块分离的Service的实现类,对应的是业务层(如一个dubbo方法可能调用多个业务块的service,这些service的实现类就用Spring的注解)。 PS: 若使用的是dubbo的Service注解时, 在controller注入的时候,要选择@Reference注解来进行注入。
2. @Component 注册为spring bean
import cn.kgc.entity.City;
import cn.kgc.mapper.CityMapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
@Service
@Component
@Transactional
public class CityServiceImpl implements CityService {
@Resource
private CityMapper cityMapper;
@Override
public List<City> findAll() {
return cityMapper.findAll();
}
@Override
public PageInfo<City> findAll(Integer pageNo) {
PageHelper.startPage(pageNo,2);
return new PageInfo<>(cityMapper.findAll());
}
}
6.测试 http://localhost:8099/dubbo 服务治理 》 提供者
4.consumer 消费者
1.pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version> 1.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.kgc</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
2.application.yml
dubbo:
application:
name: consumer
registry:
address: zookeeper://127.0.0.1:2181
mybatis:
configuration:
call-setters-on-nulls: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
上面是日志 调p端
server:
port: 8081
3.cn.kgc.controller/CityController
import cn.kgc.entity.City;
import cn.kgc.service.CityService;
import com.github.pagehelper.PageInfo;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class CityController {
@Reference
private CityService cityService;
@RequestMapping("/findAll")
public List<City> findAll(){
return cityService.findAll();
}
@RequestMapping("/findAllByPage")
public PageInfo<City> findAllByPage(@RequestParam(defaultValue = "1",required = false) Integer pageNo){
return cityService.findAll(pageNo);
}
}
4.static包/findAll.html
consumer/resources/static 里面放jsp
实现前后端分离,不用这个测试,用HBuilder X
5.启动类
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
说明: 消费者没有dao机制 但这个会调数据库 SpringBoot内置的mysql exclude排除 DataSourceAutoConfiguration.class自动数据源匹配格局 》不用跳自带的mysql 跳第三方的 生产者的数据库
测试1: http://localhost:8099/dubbo 服务治理 》消费者 测试2: postman
页面只用c端
数据库信息: http://localhost:8081/findAll
[
{
"id": 1,
"cityName": "北京"
},
{
"id": 2,
"cityName": "上海"
},
{
"id": 3,
"cityName": "广州"
},
{
"id": 4,
"cityName": "深圳"
}
]
测试三 HBuilderX
1.导js包
2.demo_dubbo/findAll.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
<script>
$(function(){
show();
});
function show(){
$.ajax({
url: "http://localhost:8081/findAll",
type: "post",
data: { },
dataType: "json",
async: false,
success: function(data){
var str = "";
$.each(data,function(i){
str += "<tr>";
str += "<td>"+data[i].id+"</td>";
str += "<td>"+data[i].cityName+"</td>";
str += "</tr>";
});
$("table").append(str);
},
error: function(){}
})
}
</script>
</head>
<body>
<table border="1px solid">
<tr>
<td>编码</td>
<td>城市名称</td>
</tr>
</table>
</body>
</html>
3.并且要加注解 跨域问题
consumer/CityController
@CrossOrigin
4.测试 http://127.0.0.1:8848/demo_dubbo/findAll.html 注意 代码其实可以自动生成, mybatis生成器 企业定制款的代码生成器 如entity\dao\service\controller/html等等, 但是只能完成简单业务。
----2021.12.28&29&30&31
|