springboot实现远程服务暴露与调用

pom引用


            org.springframework.boot
            spring-boot-starter-web
            5.0.7
        

服务端暴露接口:

1、定义接口

public interface DemoInterface {
    BaseResponse get(QueryDTO dto);
}

2、接口实现类

@Slf4j
@Service
public class DemoInterfaceImpl implements DemoInterface {
      @Override
    public BaseResponse get(QueryDTO dto) {
    	return BaseResponse.success();
    }
}

3、配置服务暴露

@Configuration
public class RemotingConfig {

    @Resource
    private DemoInterface demoInterface;

    @Bean("/demoTest")
    public HttpInvokerServiceExporter elasticUserFacade() {
        HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter();
        exporter.setService(demoInterface);
        exporter.setServiceInterface(DemoInterface.class);
        return exporter;
    }
}

应用端调用:
1、引入相同的接口文件DemoInterface,可以用二方包的形式引入
2、配置远程调用

@Configuration
public class RemotingConfig {

    @Bean
    public HttpInvokerProxyFactoryBean demoInterfaceBean(){
        HttpInvokerProxyFactoryBean factoryBean = new HttpInvokerProxyFactoryBean();
        factoryBean.setServiceUrl( "http://www.test.com/demoTest");
        factoryBean.setServiceInterface(DemoInterface.class);
        factoryBean.setHttpInvokerRequestExecutor(httpComponentsHttpInvokerRequestExecutor());
        return factoryBean;
    }

    @Bean
    public HttpComponentsHttpInvokerRequestExecutor httpComponentsHttpInvokerRequestExecutor(){
        HttpComponentsHttpInvokerRequestExecutor executor = new HttpComponentsHttpInvokerRequestExecutor();
        return executor;
    }
}

3、服务调用

@Service
public class DemoManager {
    @Resource
    private DemoInterface demoInterface;
    
    public void get(String key) {
        demoInterface.get(new QueryDTO(key));
    }
}

注意:使用此种方式进行远程服务暴露,传递的参数如果是对象,需要实现Serializable接口,生成对应的serialVersionUID,因为参数传递的时候是转化成二进制的byte数据,在反序列化的时候需要根据UID确定唯一性,否则会报错

调用原理,时序图参考如下链接:
https://www.jianshu.com/p/6da39c67a586
https://my.oschina.net/u/2518341/blog/1800131

你可能感兴趣的:(spring,中间件,微服务)