发表于: 2021-10-22 23:52:29
1 822
一,今天完成的事情
任务八。
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>
<!-- 使用RmiServiceExporter将RMIServiceImpl的对象导出为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那个,分开写好,管的也是分开的。
<!-- 引入RMI的server配置 -->
<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,然后我设置client。client的结构如图。一定要放入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
二,今天问题
我要多看工业级别代码的分布式系统。
三,今天的收获
分布式系统。模块规划。
四,明天的计划
任务八
评论