概述
文章目录
- 方式一:http(HttpUrlConnection)
- (1)特点
- (2)RestTemplate(基于HTTP协议调用)
- (3)好处
- 方式二:RPC
- (1)RPC是什么意思呢?
- (2)RPC的特点
- (3)RPC框架--->Dubbo
- (4.1)注册中心
- (4.2)dubbo控制台
- (5)开发公共的dubbo项目
- 1) 开发公共api 项目
- 2) 开发 provider (提供者)
- 配置
- 3) 开发 服务消费者 consumer
- (6) 调用流程
- 比较dubbo和rest
今天要学习的是分布式程序开发。
首先分布式应用程序是如何相互调用的嘞?
主要有两种方式:
方式一:http(HttpUrlConnection)
(1)特点
- 是基于http的短连接
- 用到时建立连接,用完了连接就断开
(2)RestTemplate(基于HTTP协议调用)
- 服务端应用(我们使用的spring boot框架,因为已经内嵌了tomcat所以可以支持http协议)
- 客户端的应用
方法一:这里我们先使用java原生的api完成调用,后面做一下对比
HttpURLConnection conn = (HttpURLConnection)
new URL("http://localhost:8080/user").openConnection();
// 获取服务器返回的响应(以字节流方式表示)
InputStream in = conn.getInputStream();
InputStreamReader reader = new InputStreamReader(in, "utf-8");
BufferedReader r = new BufferedReader(reader);
// 从字符流读取数据
while(true) {
String line = r.readLine();
if(line == null) {
break;
}
// System.out.println(line);
// 把 json 转为 java 对象, 客户端和服务器端的 User 类的定义必须要一样,om是一个静态的ObjectMapper对象在方法外部定义好,直接在内部调用对应方法,因为这里om是线程安全的。
User user = om.readValue(line, User.class);
System.out.println(user);
}
r.close();
conn.disconnect();
方法二:使用spring的RestTemplate工具类对刚才的调用进行简化
// get (查询), post (新增), put (修改), delete (删除)
RestTemplate template = new RestTemplate();
User user = template.getForObject("http://localhost:8080/user", User.class);
System.out.println(user);
(3)好处
- 调用简单
- 80端口一般不会被防火墙拦截
方式二:RPC
(1)RPC是什么意思呢?
R指的是remote远程的
P指的是procedure过程俗称方法
C指的是call也就是调用的意思
RPC即远程的方法调用
(2)RPC的特点
RPC是基于TCP的长连接
(3)RPC框架—>Dubbo
- 首先Dubbo分为provider(服务提供者),consumer(消费者),registry(注册中心)这三个部分
- 服务提供者启动后,会向注册中心注册提供信息(ip地址,服务名,方法定义等)
- 服务消费者启动后,会订阅服务信息
- 注册中心会把提供者发生的一些变更,通知给服务消费者。
- 一旦服务提供者的信息发生了变更,注册中心负责吧这些变更通知隔日服务消费者,服务消费者调用服务提供者的功能是直接调用,不经过注册中心
(4.1)注册中心
- zooleeper(分布式协调框架),其中会存储服务提供者和服务消费者的相关信息
- 可以通过一个 ZooInspector 查看注册中心中存储了哪些信息
(4.2)dubbo控制台
- 可以通过图像界面的方式查看dubbo提供者,消费者的信息
(5)开发公共的dubbo项目
1) 开发公共api 项目
公共类与接口的定义 UserService , User
mvn install
2) 开发 provider (提供者)
pom.xml 中添加必要的依赖 spring-boot, dubbo, zookeeper, curator, 公共 api
// 把这个实现类 交给 dubbo 进行管理, dubbo 会把它的信息发布至注册中心 (服务导出)
@Service
public class UserServiceImpl implements UserService {
@Override
public void insert(User user) {
System.out.println("dubbo insert, " + user);
}
@Override
public void update(User user) {
System.out.println("dubbo update, " + user);
}
@Override
public User find(String name) {
System.out.println("dubbo find, " + name);
User user = new User();
user.setAge(19);
user.setSex("男");
user.setName(name);
return user;
}
}
配置
# 配置端口
server.port=端口号
# 应用程序的名字, 需要唯一, 不能和注册中心中其他程序冲突
spring.application.name=xxx
# 注册中心
dubbo.registry.address=zookeeper://XXXip地址:端口号
# 设置连接注册中心的超时时间
dubbo.registry.timeout=xxxxx时间
# 把元数据信息 发布至注册中心
dubbo.metadata-report.address=zookeeper://localhost:xxxx
# 指定 导出服务 的包名
dubbo.scan.base-packages=xxxx.xxx
3) 开发 服务消费者 consumer
@RestController
public class MyController {
// 使用 公共的 api 接口把两者联系起来
@Reference
private UserService userService;
@RequestMapping("/user")
public User find() {
return userService.find("某某某");
}
}
spring boot 配置
# 端口
server.port=9090
# 给消费者应用起一个唯一的名字
spring.application.name=xxx
# 注册中心地址
dubbo.registry.address=zookeeper://xxx.xxx.x.x:端口号
dubbo.registry.timeout=xxxxx
(6) 调用流程
- 浏览器中访问消费者 http://localhost:9090/user
- 根据此地址找到控制器方法,接下来要调用 userService
- 但userService 是一个接口,实现不在消费者这边
- dubbo 针对这个UserService接口生成了一个代理对象
- 代理对象
- 代理对象会访问注册中心 把UserService服务的信息下载至本地
- 这些服务信息会缓存在本地,后续的调用不会再依赖注册中心
- 底层 netty nio 非阻塞io 跟服务提供者之间进行通信, tcp
bio 阻塞io
比较dubbo和rest
- dubbo 两个使用java语言的程序之间进行调用, 性能上, 字节, 服务应用程序之间,更适合长连接(规模小) 支持服务治理 (管理)
- rest 任意语言,任意平台之间进行调用, 字符, 更适合短连接(规模大)
最后
以上就是英勇自行车为你收集整理的分布式程序开发的全部内容,希望文章能够帮你解决分布式程序开发所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复