Dubbo学习笔记
1 dubbo的 作用
以下内容摘自dubbo官网:
dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现;
2 查看官网大坑
(二)dubbo管理控制台的搭建
git clone https://github.com/apache/incubator-dubbo-ops
cd incubator-dubbo-ops && mvn package
用法,分为三个 admin, register/ monitor
dubbo admin
Dubbo admin is a spring boot application, you can start it with fat jar or in IDE directly.
进入 dubbo-admin,执行 mvn install
-----------------------------
maven 下载打包时需要配置 仓库MAVEN_HOME,Path=xxxxxj,这样的话就会用配置的阿里云镜像,下载会很快
碰到了不能编译,需要配置java环境变量
编译后启动报错了,因为没改zookeeper的配置ip,重新安装打包,运行target下的 java -jar dubbo-xxxxxx.jar,账号参考配置里的 root/root 或者 guest/xxxx,端口查看配置 时 7001
dubbo monitor and dubbo registry
You can get a release of dubbo monitor in two steps:
Step 1:
git clone https://github.com/apache/incubator-dubbo-ops
Step 2:
cd incubator-dubbo-ops && mvn package
Then you will find:
dubbo-monitor-simple-2.0.0-assembly.tar.gz in incubator-dubbo-ops\dubbo-monitor-simple\target directory. Unzip it you will find the shell scripts for starting or stopping monitor.
dubbo-registry-simple-2.0.0-assembly.tar.gz in incubator-dubbo-ops\dubbo-registry-simple\target directory. Unzip it you will find the shell scripts for starting or stopping registry.
2 然后时健康检测项目,打包,改zookeeperip,解压生成的 target下的 xxx.gz,进入 assembly.bin,运行start.bat即可
F:\programme\dubbo-admin-master\dubbo-monitor-simple\target\dubbo-monitor-simple-2.0.0\assembly.bin
bat启动文件
f:
cd F:\programme\dubbo-admin-master\dubbo-admin\target
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
f:
cd F:\programme\dubbo-admin-master\dubbo-monitor-simple\target\dubbo-monitor-simple-2.0.0\assembly.bin
start.bat
4 自动生成 serializable 方法的配置再idea中
4 真实的 测试dubbo的例子
/**
* 订单服务相关接口
*/
public interface OrderService {
/**
* 初始化订单
* @param userId
*/
List<User> initOrder(String userId);
}
public interface UserService {
/**
* 获取用户信息
* @param userId
* @return
*/
List<User> getUserList(String userId);
List<User> getUserAddressList(String userId);
}
user-service-provider
<dependency>
<groupId>com.darling.dubboDemo</groupId>
<artifactId>pub-interfence</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
package com.provider.userserviceprovider.service;
import com.pubinter.pubinterface.dao.UserService;
import com.pubinter.pubinterface.pojo.User;
import java.util.ArrayList;
import java.util.List;
public class UserServiceImpl implements UserService {
public List<User> getUserAddressList(String userId) {
List<User> list = new ArrayList();
list.add(new User(3,"韦德",36,"迈阿密"));
list.add(new User(23,"詹姆斯",34,"洛杉矶"));
list.add(new User(24,"科比",39,"洛杉矶"));
return list;
}
@Override
public List<User> getUserList(String userId) {
return null;
}
}
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 当前服务的名称 -->
<dubbo:application name="user-service-provider"/>
<!-- 注册中心的地址 这里注册中心用的是zookeeper -->
<dubbo:registry protocol="zookeeper" address="148.70.4.44:2181"/>
<!-- 指定通信规则(通信协议?通信端口) -->
<dubbo:protocol name="dubbo" port="20883"></dubbo:protocol>
<!-- 需要暴露的服务 -->
<dubbo:service interface="com.pubinter.pubinterface.dao.UserService" ref="userService" version="1.0.0"/>
<!-- 需要暴露的服务的实现类 -->
<bean id="userService" class="com.provider.userserviceprovider.service.UserServiceImpl"/>
<!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
<dubbo:monitor protocol="registry"></dubbo:monitor>
<!--
timeout:超时时间配置
retries:重试次数配置(超时报错后重试连接的次数,不含第一次调用,如果目标服务有多个重试的时候会自动切换别的服务)
-->
<dubbo:provider timeout="2000" retries="6"></dubbo:provider>
</beans>
public class TestProviderDemo {
public static void main(String[] args) throws IOException {
// 加载配置文件
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("provider.xml");
// 容器启动
applicationContext.start();
// 使程序阻塞(由于是单元测试,如果程序跑完了我们再dubbo控制台看不到效果)
System.in.read();
}
}
不启用spring boot 主类,因为没必要,只启动了这个一个配置文件
order-service-consumer
<!-- 引入公共接口层的依赖 -->
<dependency>
<groupId>com.darling.dubboDemo</groupId>
<artifactId>pub-interfence</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入dubbo -->
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
/**
* @author 董琳琳
* @date 2018/9/14 11:50
* @description 订单服务的实现类
*/
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
UserService userService;
/**
* 初始化订单并调用用户服务的接口
* @param userId
* @return
*/
@Override
public List<User> initOrder(String userId) {
return userService.getUserAddressList(userId);
}
}
<?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://dubbo.apache.org/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 开启springmvc的包扫描 -->
<context:component-scan base-package="com.order.orderserviceconsumer"></context:component-scan>
<!-- 当前服务的名称 -->
<dubbo:application name="order-service-consumer"/>
<!-- 注册中心的地址 这里注册中心用的是zookeeper -->
<dubbo:registry protocol="zookeeper" address="148.70.4.44:2181"/>
<!-- 声明需要调用的远程服务的接口;生成远程服务代理 -->
<dubbo:reference id="userService" check="false" interface="com.pubinter.pubinterface.dao.UserService" version="*"/>
<!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
<dubbo:monitor protocol="registry"></dubbo:monitor>
</beans>
user必须实现serializable接口
必须要加扫描路径,不然会出错,找不到类
<context:component-scan base-package="com.darling.order"></context:component-scan>
/**
* @author 董琳琳
* @date 2018/9/14 15:57
* @description 测试服务调用者是否成功从注册中心订阅服务
*/
public class TestConsumerDemo {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
OrderService service = applicationContext.getBean(OrderService.class);
List<User> list = service.initOrder("1");
for (User user:list) {
System.out.println(user.toString());
}
System.in.read();
}
}
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = -2844400681715908324L;
private int age;
private String name;
private String address;
private int number;
User(){};
public User(int age,String name,int number,String address){
this.address=address;
this.age=age;
this.number=number;
this.name=name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
大概流程是,public 接口,有两个,一个user 类,需要实现serializable接口和 set get方法,第二个项目provider引入公共的刚才的想pub,进行生产者配置,第三个消费者配置,兜售ideal 项目的module方式,
最终的效果是
5 dubbo 2.5版本 telnet命令
默认是 22222,可用通过 dubbo.properties修改为
dubbo.application.qos.port=33333
或启动时修改
-Ddubbo.application.qos.port=33333
安全方面 ,谁都可以访问,可以关闭,这样远程的就不可访问
dubbo.application.qos.accept.foreign.ip=false
举例
telnet localhost 22222
接口方式访问
curl "localhost:22222/ls?arg1=xxx&arg2=xxxx"
常用命令:
ls 可查看producer和consumer两个角色信息
online 上线所有的服务,可以正则
online xxx.com 上线某种服务
需要下线后重新上线时采用的场景
下线命令
offline 和 online 用法一样
help 查看帮助,这个很简单 telnet 功能,默认系统配置
-Ddubbo.application.qos.enable=true
-Ddubbo.application.qos.port=33333
-Ddubbo.application.qos.accept.foreign.ip=false
1 docker 使用Dockerfile 构建镜像
例子 只两行
FROM nginx
RUN echo 'abc' > /usr/nginx/index.html
from指定从nginx作为基础版本
run 是执行 linux命令
内容两行
执行一条命令 构建
docker build -他nginx:my .
在当前路径构建,点是当前路径,后面的是名字
执行一条命令运行
docker -d -p 11:80
浏览器打开 xxx:11 结果是自己写的命令输入的内容,所以自己的 镜像构建成功了
docker 的命令15个太多了
2 使用maven 插件打包发布程序为新 镜像分三步,1 是 加maven依赖 配置,
包括了 imagename镜像名 ,包括了 仓库名,镜像名,标签用冒号,2 entrypoint 表示执行的命令
baseimage 就是 from 基于java的 都是
同时引入了 resource.resource.include 表示引入了 拷贝xxx.jar
第二步是 构建,第三步是 运行,就可以查看到了 镜像和容器
3 然后更加专业的写法,baseimage和 enpoint 都不在pom里,而在 Dockerfile文件里,在 pom只指定一个目录就行了,这样是生产环境专业的写法
4 最终 自己建立的docker 镜像 会推送到 docker hub中,或者是个人仓库中,
可以用maven也可以用push命令,push命令还没有用过,下面例子是maven:
如果是 hub中心则 在maven的server 中配置 id,hub的 用户名,hub的密码
也可以私有镜像,但需要 baseImage中设置 localhost:5000 xxxxxxxxx