分布式程序开发

20 篇文章 0 订阅


今天要学习的是分布式程序开发。
首先分布式应用程序是如何相互调用的嘞?
主要有两种方式:

方式一: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) 调用流程

  1. 浏览器中访问消费者 http://localhost:9090/user
  2. 根据此地址找到控制器方法,接下来要调用 userService
  3. 但userService 是一个接口,实现不在消费者这边
  4. dubbo 针对这个UserService接口生成了一个代理对象
  5. 代理对象
    • 代理对象会访问注册中心 把UserService服务的信息下载至本地
    • 这些服务信息会缓存在本地,后续的调用不会再依赖注册中心
    • 底层 netty nio 非阻塞io 跟服务提供者之间进行通信, tcp
      bio 阻塞io

比较dubbo和rest

  • dubbo 两个使用java语言的程序之间进行调用, 性能上, 字节, 服务应用程序之间,更适合长连接(规模小) 支持服务治理 (管理)
  • rest 任意语言,任意平台之间进行调用, 字符, 更适合短连接(规模大)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值