发表于: 2021-10-22 23:52:29

1 821


一,今天完成的事情

任务八。

1,如果遇到一个问题,我会分解问题,分阶段测试我的代码是否能正常运行。RMI解决的问题是client在远程调用service。

项目要求要有两个不同的service源头,我决定先成功制作一个service。

client肯定要有一个,一个也完成任务八的要求。client首先只调用一个service,而且不涉及client自己的controller层能调用成功。


2,我首先建立一个空的Maven项目。

分布式系统一般会有一个放通用代码的地方。在RMI中,通用的部分肯定包含一个Interface,就是Service。另外pojo/entity/model也可以考虑放在公共部分,描述各种实体。util也考虑放在公共部分,大家都用。config也考虑放在公共部分,各个部分可能会用到的设置。如果util config带resource中放的文件页也放在resource中。我在任务八中把这个模块叫做common。

我有一个client模块。

两个service模块。

所以最终我的项目布局如下图。


rigister_upload_rmi的pom.xml里面自动加入module。

<modules>
   <module>common</module>
   <module>client</module>
   <module>serviceone</module>
   <module>servicetwo</module>
   <module>servicetwo</module>
   <module>serviceone</module>
</modules>



3,我的common暂时如下图。除了service,和这次的entity,可以采用其它的放置方式。代码没有更改。


common的pom.xml和另外3个模块可以声明

<parent>
 <groupId></groupId>
 <artifactId></artifactId>
 <version></version>
</parent>

可以引入parent中的依赖,管理多个模块/项目之间的公共的依赖。


4,我先做serviceone。serviceone的结构如图。一定要放入service以及以下层次在原来项目,且没有在common中的代码。


serviceone的pom.xml加入

<dependency>
 <groupId>org.example</groupId>
 <artifactId>common</artifactId>
 <version>1.0-SNAPSHOT</version>
 <!--   <packaging>jar</packaging>-->
</dependency>

来使用common中的各种代码,包括main中的


然后加入server.xml

<!-- 服务端 -->
<bean id="UserServiceImpl" class="com.nicole.service.impl.UserServiceImpl"></bean>

<!-- 使用RmiServiceExporterRMIServiceImpl的对象导出为RMI服务对象 -->
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
  <!--服务的接口类型-->
  <property name="serviceInterface" value="com.nicole.service.UserService"/>
  <!--对外的名称,即客户端访问时用这个名字找到这个服务-->
  <property name="serviceName" value="serviceone"/>
  <!--服务占用的端口-->
  <property name="registryPort" value="7010"/>
  <!--<property name="servicePort" value="7010"/>-->
  <!--要发布成服务的类-->
  <property name="service" ref="UserServiceImpl"/>

serviceport可以不配置


service有关的spring-mybatis.xml,没有mvc那个,分开写好,管的也是分开的。

<!-- 引入RMIserver配置 -->
<import resource="classpath:server.xml"/>


在Spring中,我用main启动。Springboot中一般不用xml配置,是set配置,一般也是用@SpringBootApplication里面有@Bean,来run。

package com.nicole.domain;

import com.nicole.service.impl.UserServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class ServerDoB {
public static final Logger logger = LoggerFactory.getLogger(ServerDoB.class);

   public static void main(String[] args) {

try {
//            System.setProperty("java.rmi.server.hostname","127.0.0.1");
           ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
"classpath:spring-mybatis.xml");
           logger.info("\n" + "Service One Starts. Waiting for the client");
       } catch (Exception e) {
logger.error("Error " + e.getMessage());
           e.printStackTrace();
       }
}
}

还是缺省设置"java.rmi.server.hostname",默认就是"127.0.0.1"

applicationContext.getBean("UserServiceImpl"); 这个语句也不需要在启动server中,是远程需要调用service。service这个项目内部本身不自己调用自己的service。我一般不在service中互相调用。


5,然后我设置clientclient的结构如图。一定要放入controller以及以上层次在原来项目,且没有在common中的代码。

网页也要放进webapp,因为这是controller以及以上层次在原来项目。

client的pom.xml中也是加入

<dependency>
 <groupId>org.example</groupId>
 <artifactId>common</artifactId>
 <version>1.0-SNAPSHOT</version>
 <!--   <packaging>jar</packaging>-->
</dependency>

来使用common中的各种代码,包括main中的

然后加入client.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
      xmlns:context="http://www.springframework.org/schema/context"
      xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 
  <context:annotation-config/>
  <context:component-scan base-package="com.nicole" />

   <!--RMI客户端配置-->
   <!-- 客户端调用-UserServiceOne -->
   <bean name="UserServiceOne" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"
         lazy-init="true">
       <!-- 根据服务端的serviceName(服务名)和registryPort(端口)组成的访问地址 -->
       <property name="serviceUrl" value="rmi://127.0.0.1:7010/serviceone"></property>
       <property name="serviceInterface" value="com.nicole.service.UserService"></property>
       <!-- 预查找远程对象 默认为true -->
       <property name="lookupStubOnStartup" value="false"/>
       <!-- 是否刷新远程调用缓存的stub -->
       <property name="refreshStubOnConnectFailure" value="true"></property>
   </bean>
</beans>


我直接用main测试插入

package com.nicole.maintest;

import com.nicole.entity.User;
import com.nicole.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("client.xml");
       UserService userService = (UserService) context.getBean("UserServiceOne");
       User user = new User();
       user.setImageurl("/image2");
       user.setUsername("nicole");
       user.setCellphone("+1234567890");
       user.setEmail("hidear@gmail.com");
       user.setPassword("abcd1234");
       user.setCreatedAt( System.currentTimeMillis());
       user.setUpdatedAt(System.currentTimeMillis());
       userService.insertUser( user) ;
   }
}



插入成功。所以我的client能正常调用远程service




二,今天问题

我要多看工业级别代码的分布式系统。


三,今天的收获

分布式系统。模块规划。


四,明天的计划

任务八


返回列表 返回列表
评论

    分享到