1.最近学习dubbo 参照网上资料首次集成springboot和dubbo 特记录本次操作
废话不多说 直接开干
1.安装zookeeper
1.安装zookee 直接参照网上弄了个单机版的zookeeper
官网下载后 直接解压到相关目录
在目录下新建data和logs文件夹
在zookeeper-3.4.13\conf conf目录下 打开zoo_sample.cfg 修改以下内容 另存为zoo.cfg
dataDir=E:/zk/zookeeper-3.4.13/data
dataLogDir=E:/zk/zookeeper-3.4.13/logs
之后就可以启动zookeeper的服务了
到bin目录下直接输入cmd 运行 zkServer.cmd启动服务
2.dubbo
https://gitee.com/chenghao842822530/springbootdemo/attach_files
dubbo在打war包之前修改其配置如下:
WEB-INF目录下的dubbo.properties文件
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
然后启动tomcat就启动了dubbo的服务,我们可以访问控制台看看
这个是网上我直接copy过来的 直接下载war包 copy到tomcat的webapp目录下 运行
http://localhost:8089/dubbo-admin-2.5.4 我把tomcat的端口设置成了8089 注意自己的默认的是8080
输入密码root
这是dubbo 可以查看到 我们的服务 生产者和消费者 我已经运行了 所以有个数据
3.编写java生产者 和 消费者
3.1 生产者
新建springboot项目 可以到 https://start.spring.io/ 快速新建一个springboot项目
先看目录结构
配置项写在了properties里 也可以是xml里
## Dubbo \u670D\u52A1\u63D0\u4F9B\u8005\u914D\u7F6E
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.dubbo.dubbodemo.service
pom的依赖 增加以下依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
下面我们创建一个简单的服务(其实就是写个接口 实现接口 给消费者调用)
首先创建个实体类User
com.dubbo.dubbodemo.domain.User;
package com.dubbo.dubbodemo.domain;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
String name;
String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
创建接口
com.dubbo.dubbodemo.service.UserService
package com.dubbo.dubbodemo.service;
import com.dubbo.dubbodemo.domain.User;
public interface UserService {
User saveUser(User user);
}
实现接口UserService 注意这里的@Service 是dubbo的service
com.dubbo.dubbodemo.service.impl;
package com.dubbo.dubbodemo.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.dubbodemo.service.UserService;
import com.dubbo.dubbodemo.domain.User;
@Service
public class UserServiceImpl implements UserService {
@Override
public User saveUser(User user) {
// user.setAge("1");
// user.setName("hanhao");
// TODO Auto-generated method stub
System.out.println(user.toString());
System.out.println(user.toString());
return user;
}
}
到这里生产者我们就完成了
3.2消费者 创建一个新的springboot项目
新建User
com.dubbo.dubbodemo.domain.User
package com.dubbo.dubbodemo.domain;
import java.io.Serializable;
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
String name;
String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
新建Service com.dubbo.dubbodemo.service.UserService
package com.dubbo.dubbodemo.service;
import com.dubbo.dubbodemo.domain.User;
public interface UserService {
User saveUser(User user);
}
新建调用Service的方法 注意
@Reference
com.dubbo.dubbodemo.service.ComsumerService
package com.dubbo.dubbodemo.service;
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Reference;
import com.dubbo.dubbodemo.domain.User;
@Component
public class ConsumerService {
@Reference
UserService userService;
public User saveUser()
{
User user = new User();
user.setAge("10");
user.setName("hanwenhao");
return userService.saveUser(user);
}
}
新建一个controller调用 UserController
package com.dubbo.dubbodemo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.dubbo.dubbodemo.service.ConsumerService;
@RestController
public class UserController{
/**
*
*/
@Autowired
private ConsumerService service;
@RequestMapping("/save")
public Object saveUser()
{
System.out.println("customer");
return service.saveUser();
}
}
消费者完成
忘记说消费者的pom 加下面依赖
<!-- Spring Boot Dubbo 依赖 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
properties配置
## \u907F\u514D\u548C server \u5DE5\u7A0B\u7AEF\u53E3\u51B2\u7A81
##因为我是一台机器运行 设置8081防止端口占用
server.port=8081
## Dubbo \u670D\u52A1\u6D88\u8D39\u8005\u914D\u7F6E
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=com.dubbo.dubbodemo.service
运行后
查看dubbo里面有没有什么神奇的东西出现 而后调用controller 实现调用
调用Cotrolller结果
感想
自己根据网上搞的第一个springboot dubbo zookeeper示例 代码写的不太规范
这个dubbo zookeeper集成说是分布式 感觉和接口调用有点类似。网上查了下
http好比普通话,rpc好比团伙内部黑话。
讲普通话,好处就是谁都听得懂,谁都会讲。
讲黑话,好处是可以更精简、更加保密、更加可定制,坏处就是要求“说”黑话的那一方(client端)也要懂,而且一旦大家都说一种黑话了,换黑话就困难了。
所谓的效率优势是针对http1.1协议来讲的,http2.0协议已经优化编码效率问题,像grpc这种rpc库使用的就是http2.0协议。这么来说吧http容器的性能测试单位通常是kqps,自定义tpc协议则通常是以10kqps到100kqps为基准
简单来说成熟的rpc库相对http容器,跟多的是封装了“服务发现”,"错误重试"一类面向服务的高级特性。可以这么理解,rpc框架是面向服务的更高级的封装。如果把一个http server容器上封装一层服务发现和函数代理调用,那它就已经可以做一个rpc框架了。
所以为什么要用rpc调用?
因为良好的rpc调用是面向服务的封装,针对服务的可用性和效率等都做了优化。单纯使用http调用则缺少了这些特性。