系统间信息传输

不同系统之间实现数据传输,下面列举两种方式,如果大家有其他的方式,欢迎提出来,大家一起研究。
第一种就是使用http传输的方式,第二种就是使用MQ的方式。

使用OkHttp的方式

新建SpringBoot项目,然后编写两个接口,一个用于发送数据,一个用于插入数据到MySQL表中。将该项目打包成jar包,放进云服务器里面(或者修改一下端口,本地启动也是可以的)。

@PostMapping(value = "/insert")
    public User insert(@RequestBody User user) {
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        userService.save(user);
        return user;
    }

@PostMapping(value = "/http")
public User http(@RequestBody User user) {
    user.setCreateTime(new Date());
    user.setUpdateTime(new Date());
    user.setTranceMode("OkHttp");
    String param = JSONObject.toJSONString(user);
    String url = "http://服务器ip:9090/insert";
    OkHttpClient client = new OkHttpClient();
    okhttp3.RequestBody requestBody = okhttp3.RequestBody.create(param.getBytes(), MediaType.parse("application/json"));
    Request request = new Request.Builder()
            .url(url)
            .post(requestBody)
            .build();
    try {
        Response response = client.newCall(request).execute();
        log.info("响应信息是--->{}", response.message());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        
    }
    return user;
}

在云服务器里面启动这个项目,显示如下:
在这里插入图片描述
然后本地启动这个项目,调用http的接口发送数据:

### okhttp接口
POST http://localhost:9090/http
Content-Type: application/json

{
  "name": "路人甲",
  "age": 23,
  "birthday": "2024-10-23 10:44:49 147",
  "tranceMode": "OkHttp"
}

这个时候我们可以查看服务器打印的日志,如下:
在这里插入图片描述
然后查看表中的数据,如下:
在这里插入图片描述
这样我们就可以看到将数据传输到其他系统上面了。

使用RabbitMQ的方式

private static final String EXCHANGE_NAME = "exchange_demo";
private static final String ROUTING_KEY = "routingkey_demo";
private static final String QUEUE_NAME = "queue_demo";
private static final String IP_ADDRESS = "服务器的ip地址";
private static final int PORT = 5672; //RabbitMQ 服务端默认端口号为 5672
private static final String USER_NAME = "admin";
private static final String PASSWORD = "admin";
@PostMapping("/mq-send")
public User mqSend(@RequestBody User user) throws IOException, TimeoutException {
    user.setCreateTime(new Date());
    user.setUpdateTime(new Date());
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost(IP_ADDRESS);
    factory.setPort(PORT);
    factory.setUsername(USER_NAME);
    factory.setPassword(PASSWORD);
    Connection connection = factory.newConnection(); //创建连接
    Channel channel = connection.createChannel(); //创建信道
    //创建一个 type = DIRECT、持久化的、非自动删除的交换器
    channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true, false, null);
    //创建一个持久化、非排他的、非自动删除的队列
    channel.queueDeclare(QUEUE_NAME, true, false, false, null);
    //将交换器与队列通过路由键绑定
    channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
    //发送一条持久化的信息
    String message = JSONObject.toJSONString(user);
    channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
    //关闭资源
    channel.close();
    connection.close();
    return user;
}

@GetMapping("/mq-receive")
public void mqReceive() throws IOException, InterruptedException, TimeoutException {
    Address[] addresses = new Address[]{new Address(IP_ADDRESS, PORT)};
    ConnectionFactory factory = new ConnectionFactory();
    factory.setUsername(USER_NAME);
    factory.setPassword(PASSWORD);
    Connection connection = factory.newConnection(addresses); //创建连接
    final Channel channel = connection.createChannel(); //创建信道
    channel.basicQos(64); //设置客户端最多接收未被ack的消息的个数
    Consumer consumer = new DefaultConsumer(channel) {
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            log.info("接收信息:{}",new String(body));
            User user = JSON.parseObject(body, User.class);
            userService.save(user);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
            channel.basicAck(envelope.getDeliveryTag(), false);
        }
    };
    channel.basicConsume(QUEUE_NAME, consumer);
    //等待回调函数执行完毕之后,关闭资源
    TimeUnit.SECONDS.sleep(5);
    channel.close();
    connection.close();
}

和上述方式一样,一个部署到云服务器中,一个本地启动。然后我们在本地调用发送数据的接口,在服务器调用接收数据的接口,这样就可以实现不同系统之间的数据交换了。(RabbitMQ的安装与启动略,大家可以去参考其他文章或者视频完成下载安装)

### MQ发送数据接口
POST http://localhost:9090/mq-send
Content-Type: application/json

{
  "name": "赵六",
  "age": 22,
  "birthday": "2024-10-21 16:23:49 147",
  "tranceMode": "MQ"
}
### 服务器使用MQ接受数据
GET http://服务器ip:9090/mq-receive

在这里插入图片描述
我们可以在MQ上面查看到消息的发送与接收的情况。
这个时候我们再看服务器的日志以及MySQL表,就可以发现,数据已经传输过去了。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值