架构技术
RPC: Remote Procedure Call 远程过程调用
解决进程之间的通信方式, Dubbo 是一种RPC的框架
Dubbo 的三大核心能力:
- 面向接口的远程方法调用
- 智能容错和负载均衡
- 服务自动注册和发现(zookeeper是其中一种注册中心)
- 服务器容器负责启动,加载,运行服务提供者
- 服务提供者在启动时,向注册中心注册自己提供的服务
- 服务消费者在启动时,向注册中心订阅自己需要的服务
- 注册服务中心返回服务提供者地址列表给消费者, 如有变更通过长连接消息通知消费者
- 服务消费者通过软负载均衡算法(通过代码实现的负载均衡算法)去调用服务提供者, 如果调用失败则进行调用下一个提供者
- 服务提供者和服务消费者,在内存中累计调用的时间和次数, 定时每分钟发送一次统计数据到监控中心
配置:
provider.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:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置spring包扫描-->
<context:component-scan base-package="com.lily.dubbo"/>
<!-- 配置 dubbo 的应用名称-->
<dubbo:application name="dubbo_provide"/>
<!-- 配置 dubbo 的注册中心zookeeper-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 配置通信协议, 每个服务提供者的 port 不应该一样-->
<dubbo:protocol name="dubbo" port="8888"/>
<!--配置dubbo注解包扫描-->
<dubbo:annotation package="com.lily.dubbo.service.impl"/>
<!-- 加入dubbo扫包之后不再需要手动注册了-->
<!-- 把service等提供服务的注册到注册中心 1. 先构建对象 2.把业务对象注册到zookeeper-->
<!-- <bean class="com.lily.dubbo.service.impl.UserServiceImpl" name="userService"/>-->
<!-- <dubbo:service interface="com.lily.dubbo.service.UserService" ref="userService"/>-->
</beans>
service: 使用注解向注册中心进行注册
package com.lily.dubbo.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.lily.dubbo.service.UserService;
//这个service要使用dubbo的service, 这样才能将它注册到注册中心
@Service
public class UserServiceImpl implements UserService {
public boolean login(String username, String pwd) {
System.out.println("UserServiceImpl.login"+ "username="+username + ",pwd="+pwd);
if ("admin".equals(username) && "123".equals(pwd)){
return true;
}
return false;
}
}
consumer.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:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.lily.dubbo.controller"/>
<!-- 配置dubbo的应用名称-->
<dubbo:application name="dubbo-consumer"/>
<!-- 配置订阅的位置-->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 配置订阅到的引用类型-->
<dubbo:reference interface="com.lily.dubbo.service.UserService" id="userService"/>
<!-- 扫描的方式暴露接口 -->
<dubbo:annotation package="com.lily.dubbo.controller" />
<!-- 将userService对象注入到controller中-->
<!-- <bean class="com.lily.dubbo.controller.UserController">-->
<!-- <property name="userService" ref="userService"/>-->
<!-- </bean>-->
</beans>
controller: 使用注解方式获得对象索引
package com.lily.dubbo.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.lily.dubbo.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/user")
public class UserController {
//注意reference也需要使用dubbo包的
@Reference
private UserService userService;
@RequestMapping("/login")
@ResponseBody
public String login(String userName, String pwd) {
System.out.println("UserController.login username = "+userName+", pwd ="+pwd);
boolean login = userService.login(userName, pwd);
if (login)
return "success";
else
return "failed";
}
}
网友评论