一、Hessian与spring集成
Hessian可以与spring完美无缝的集成,我们先来看一下如何集成:
服务端服务暴露
@Autowired
private HelloService helloService;
@Bean(name = "/helloService")
public HessianServiceExporter exportHelloService() {
HessianServiceExporter exporter = new HessianServiceExporter();
exporter.setService(helloService);
exporter.setServiceInterface(HelloService .class);
return exporter;
}
以上使用spring在代码配置声明bean的方式暴露了一个hession服务:http://localhost:8080/Hello/helloService
客户端声明与调用
声明
<bean id="studentService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<!-- 请求代理Servlet路径 -->
<property name="serviceUrl">
<value>http://localhost:8080/Hello/helloService</value>
</property>
<!-- 接口定义 -->
<property name="serviceInterface">
<value>com.test.hello.service.HelloService</value>
</property>
</bean>
调用
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:/spring/ApplicationContext.xml");
HelloService helloService = (HelloService) context.getBean("helloService");
helloService.sayHi("hi, i am client");
二、存在的问题
上述的方法是最常用的集成方式,但存在一个问题,如果我们现在要在服务端暴露另外一个服务,那么需要添加如下代码:
@Autowired
private AnotherService1 anotherService;
@Bean(name = "/anotherService")
public HessianServiceExporter exportAnotherService() {
HessianServiceExporter exporter = new HessianServiceExporter();
exporter.setService(anotherService);
exporter.setServiceInterface(AnotherService .class);
return exporter;
}
如果再来一个服务呢,那我们就再添加类似的代码,能不能不重复添加这些类似的暴露代码呢?
三、使用注解自动暴露服务
首先,新建一个叫HessianService的注解类,注意这个注解类包含了spring的Service注解
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Service;
@Target({ java.lang.annotation.ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface HessianService {
public abstract String value() default "";
}
接着,我们把原先用@Service注解的服务类换成@HessianService
@HessianService
public class HelloServiceImpl implements HelloService {
...
...
}
然后,我们使用spring的BeanFactoryPostProcessor机制,动态暴露hessian服务
@Component
public class HessianServiceScanner implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] beanNames = beanFactory
.getBeanNamesForAnnotation(HessianService.class);
for (String beanName : beanNames) {
String className = beanFactory.getBeanDefinition(beanName)
.getBeanClassName();
Class<?> clasz = null;
try {
clasz = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new BeanInitializationException(e.getMessage(), e);
}
String hessianServiceBeanName = "/" + beanName.replace("Impl", "");
BeanDefinitionBuilder builder = BeanDefinitionBuilder
.rootBeanDefinition(HessianServiceExporter.class);
builder.addPropertyReference("service", beanName);
builder.addPropertyValue("serviceInterface",
clasz.getInterfaces()[0].getName());
((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(
hessianServiceBeanName, builder.getBeanDefinition());
}
}
}
分享到:
相关推荐
在Spring中,可以使用`HessianServiceExporter`类来暴露一个服务为Hessian服务,通过简单的配置,就可以让其他客户端通过Hessian协议访问这个服务。 下面是一个简单的例子,展示如何使用注解暴露一个基于Hessian的...
- 在服务消费者端,你需要创建一个服务引用,使用`@Reference`注解,指定服务接口和版本,Dubbo会根据配置自动从注册中心获取服务提供者的地址。 - 注意,消费者端并不需要直接处理HTTP请求,Dubbo会处理底层通信...
3. **Hessian服务暴露**:使用Spring的AOP(面向切面编程)和HessianProxyFactoryBean,将服务接口暴露为Hessian服务。这样,客户端可以通过HTTP请求调用这些服务。 4. **配置Hibernate**:在Spring配置文件中设置...
在服务器端,使用HessianServlet启动Hessian服务,将服务注册到Servlet容器中。 ```java public class HessianServer { public static void main(String[] args) throws IOException { HessianServlet servlet = ...
5. **部署和运行**:部署服务端和客户端,客户端通过Hessian客户端API调用服务端的Hessian服务,AOP通知会在适当的时候执行。 在提供的"AopTest"文件中,可能包含了上述步骤的示例代码,如Hessian服务的定义、AOP切...
2. "H1":这个文件可能是Hessian服务的一个具体实现或者相关的测试类,可能包含了Hession客户端和服务端的具体交互逻辑。 详细知识点: 1. **Spring框架**:Spring提供了bean的生命周期管理,依赖注入,以及AOP切...
在Spring中配置Hessian服务,我们可以利用Spring的自动装配能力,简化服务的发布和消费过程。 要实现Spring4与Hessian4的结合,你需要完成以下步骤: 1. **配置服务提供方**: - 首先,创建一个服务接口和其实现...
接着,我们利用`HessianExporter`将这个bean暴露为Hessian服务,可以通过`@Bean`注解或在配置文件中进行配置。 2. **服务消费方(Client)** 在客户端,我们需要创建一个HessianProxyFactoryBean,设置服务URL和...
Hessoa通过注解的方式暴露服务,通过手工配置hosts路由的方式发现服务,但已经具备负载均衡和自动摘除和恢复服务的特性。 hessoa的使用请详见hessoa-demo。【必须】请先在本地安装一个redis,默认端口无密码即可,...
4. **服务暴露**:通过Dubbo的Provider接口,服务提供者将服务暴露出去,使得服务消费者可以通过网络调用。暴露服务时,需要指定服务的注册中心和通信协议。 5. **注册中心**:Dubbo支持多种注册中心,如Zookeeper...
这样,服务提供者和服务消费者可以通过Spring的XML配置或注解方式来声明和引用服务。 搭建步骤如下: 1. **环境准备**:确保安装了Java开发环境,以及Zookeeper服务的运行环境。 2. **创建服务接口**:定义业务...
RPC允许服务提供者暴露一组服务接口,服务消费者通过这些接口像调用本地方法一样调用远程服务。整个过程对调用者透明,隐藏了网络通信和数据序列化的细节。 在SpringBoot中实现RPC服务,我们通常会借助于第三方RPC...
服务提供者通过 Netty 协议暴露服务,服务消费者则通过服务目录获取服务提供者的地址,进而通过负载均衡策略选择服务实例进行通信。服务注册和发现是通过注册中心(如 Nacos 或 Zookeeper)来实现的,确保服务的动态...
然后,通过`@Service`注解标记实现类,指定接口类型和服务版本,Dubbo会自动扫描并暴露这个服务。 2. **配置文件**:Dubbo的配置通常在`dubbo.properties`或XML配置文件中进行,包括服务端口、注册中心地址、服务...
2. **服务消费者(Consumer)**:服务消费者通过配置或者编程方式引用服务提供者提供的服务,Dubbo会自动进行服务发现和调用。消费者也可以配置消费策略,如异步调用、缓存策略等。 3. **注册中心(Registry)**:...
SpringBoot通过`@EnableDubbo`注解启动Dubbo的自动配置,这个注解会扫描并加载相关的配置,包括服务提供者和服务消费者的配置。 6. **测试与监控**: - 使用`@Autowired`的`MockMvc`进行服务接口的单元测试。 - ...
1. **自动配置**: SpringBoot通过`@EnableAutoConfiguration`注解自动配置了各种常见的Bean,如数据源、JdbcTemplate、Redis等,减少了大量XML配置。 2. **起步依赖(Starter)**: SpringBoot通过起步依赖提供了一种...
- 在Spring框架下,Dubbo可以通过XML配置或注解进行服务的声明式管理。服务接口、实现类、服务版本、调用超时、重试次数等都可以通过配置进行控制。 - Dubbo还提供了丰富的API,用于动态修改服务行为、监控服务...
2. 创建服务提供者,定义服务接口和实现,并通过Dubbo的@Service和@Reference注解进行服务暴露和服务引用。 3. 设置Zookeeper客户端,连接Zookeeper服务器,完成服务的注册与发现。 4. 使用Spring Boot的启动类启动...