東川印記

一本東川,笑看爭龍斗虎;寰茫兦者,度橫佰昧人生。

简单学习微服务01之RMI

2022年6月9日星期四



自带的RMI

定义三个module,分别为 api、client、server。

其中api提供Bean及接口,server实现接口,client调用接口。从而实现client调用server。

TestRMI -> Spring Web项目

配图1,项目基本配置

报错 Remote host terminated the handshake.看起来是网络问题

关掉本地代理,用路由器代理就好了。。。。

打开项目,是一个默认的spring web结构,配图2

删掉各种目录,只留 .idea、pom、iml这仨文件即可。

然后新建module:api、server、client。

子项目直接用脚手架创建,配图3

1,api 定义接口及Bean

如 UserBean implements Serializable,需要实现序列化

及interface IUserService.

public interface IUserService {

    /**
     * 获取用户根据ID
     *
     * @param userId 用户ID
     * @return UserBean
     */
    UserBean findUserById(Integer userId);

}


2,Service实现

service 模块,实现api中接口,添加@Service注解

import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements IUserService {

    @Override
    public UserBean findUserById(Integer userId) {
        UserBean bean = new UserBean();

        String name = "默认用户";
        switch (userId) {
            case 1:
                name = "张三";
                break;
            case 2:
                name = "李四";
                break;
            case 3:
                name = "王五";
                break;
            default:
                break;
        }

        bean.setId(userId);
        bean.setName(name);

        return bean;
    }
}

定义RMI Config, 用于对外暴露

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.rmi.RmiServiceExporter;

@Configuration
public class RmiConfig {

    @Autowired
    private IUserService userService;

    @Bean
    public RmiServiceExporter serviceExporter() {
        RmiServiceExporter exporter = new RmiServiceExporter();
        exporter.setService(userService);
        exporter.setServiceInterface(IUserService.class);
        exporter.setRegistryPort(2022);
        exporter.setServiceName("userService");
        return exporter;
    }
}


定义启动类

@SpringBootApplication
public class ServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class, args);
    }

}

resource.yaml中,配置启动端口


3,client中调用

定义调用业务

@Component
public class UserClient implements CommandLineRunner {

    @Autowired
    private IUserService userService;

    @Override
    public void run(String... args) throws Exception {
        System.out.println("用户1 is " + userService.findUserById(1));
        System.out.println("用户2 is " + userService.findUserById(2));
        System.out.println("用户3 is " + userService.findUserById(3));
        System.out.println("用户4 is " + userService.findUserById(4));
    }
}

获取rmi中暴露的Service

@Configuration
public class RmiConfig {


    @Bean(name = "userService")
    public RmiProxyFactoryBean proxyFactoryBean() {
        RmiProxyFactoryBean bean = new RmiProxyFactoryBean();
        bean.setServiceUrl("rmi://127.0.0.1:2022/userService");
        bean.setServiceInterface(IUserService.class);
        return bean;
    }

}

定义启动类

@SpringBootApplication
public class ClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }

}

修改端口为8082


4,运行

先启动Service,后启动client

用户1 is UserBean{id=1, name='张三'}
用户2 is UserBean{id=2, name='李四'}
用户3 is UserBean{id=3, name='王五'}
用户4 is UserBean{id=4, name='默认用户'}

获取成功。

可以说是一个非常简单的demo了。。。。

对微服务的理解还是有一定帮助的。。。。


--
senRsl
2022年06月09日17:29:22

没有评论 :

发表评论