微服务架构-基于注解RPC通信的案例分享

本文介绍了基于注解的RPC通信在微服务架构中的应用。在会员服务查询订单信息的场景下,探讨了HTTP和基于Socket的RPC协议选择。分享了一个案例,详细展示了如何在会员服务中通过动态代理调用订单服务接口,并提供了代码示例,包括自定义注解、动态代理实现、服务的自动注册和发布。最后展示了运行结果,鼓励读者交流讨论。
摘要由CSDN通过智能技术生成

一、前言

简单聊一下RPC(Remote  Procedure  Call)  ,远程过程调用,底层基于TCP/IP通信,下图是简单的微服务架构,会员服务需要查询当前会员下面的订单信息,则会涉及会员服务调用订单服务:

1、用户终端访问主站首页;

2、用户登陆,调用会员的登陆验证服务;

3、用户查看我的订单,调用会员服务的订单列表查询-->这时涉及会员服务调用订单服务;

      技术选型:

      1)可以采用HTTP访问,https://域名/接口/参数

      2)可以采用基于Socket通信的RPC协议,实现会员服务与订单服务的通信。

 

 二、案例分享:

  1、首先将订单服务接口打包,供会员服务引用:

      

package org.example;

/**
 * @program: OrderService
 * @description
 * @author: 大龄程序猿
 * @create: 2020-06-22 23:52
 **/
public interface IOrderService {
      String  queryOrderList();
      String  orderById(String id);
}

系统间通信的数据结构:

package org.example;

import java.io.Serializable;
import java.util.Arrays;

/**
 * @program: OrderService
 * @description
 * @author: 大龄程序猿
 * @create: 2020-06-23 00:39
 **/
public class RpcRequest implements Serializable {
    private static final long serialVersionUID = 1502241954359378124L;
    private String className;
    private String methodName;
    private Object[] args;
    private Class[] types;

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getMethodName() {
        return methodName;
    }

    public void setMethodName(String methodName) {
        this.methodName = methodName;
    }

    public Object[] getArgs() {
        return args;
    }

    public void setArgs(Object[] args) {
        this.args = args;
    }

    public Class[] getTypes() {
        return types;
    }

    public void setTypes(Class[] types) {
        this.types = types;
    }

    @Override
    public String toString() {
        return "RpcRequest{" +
                "className='" + className + '\'' +
                ", methodName='" + methodName + '\'' +
                ", args=" + Arrays.toString(args) +
                ", types=" + Arrays.toString(types) +
                '}';
    }
}

 

2、会员服务代码开发:

     会员服务在本次的业务场景中,充当着客户端的角色,咱们需要知道服务端的SocketServer的监听端口,另外通过订单的接口,咱们可以通过动态代理,在h对象中,调用服务的服务接口,并将结果通过流,回写到客户端,整个流程看起来,就像在调用客户端本地的方法。

 

代码示例,代码骨架基于SpringBoot:

自定义注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @program: UserService
 * @description
 * @author: 大龄程序猿
 * @create: 2020-06-23 23:36
 **/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface JasonReference {
}

 动态代理,实现接口的注入

package org.example;

import org.example.annotation.JasonReference;
import org.springframework.beans.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石头城程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值