分布式框架-dubbo

1.软件架构的演进过程

1.1 单一应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

1.2 垂直应用架构

垂直应用架构,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的web框架(MVC)是关键。

1.3 分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,是前端应用能更快速的相应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

1.4 流动计算架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

SOA介绍

​ SOA 全称为 Service-Oriented Architecture,即面向服务的架构。它可以根据需求通过网络对松散耦合的粗粒度应用组件(服务)进行分布式部署、组合和使用。一个服务通常以独立的形式存在于操作系统进程中。
​ 站在功能的角度,把业务逻辑抽象成可复用、可组装的服务,通过服务的编排实现业务的快速再生,目的:把原先固有的业务功能转变为通用的业务服务,实现业务逻辑的快速复用。
​ 通过上面的描述可以发现 SOA 有如下几个特点: 分布式、可重用、扩展灵活、松耦合。

2.Dubbo

Apache Dubbo 是一款高性能的 Java RPC 框架。

2.1 RPC介绍

RPC全称remote procedure call,即远程过程调用。比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。

2.2 Dubbo架构

服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心(zookeeper)返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

3.Dubbo的入门案例

3.1 服务的提供者

服务的提供者:三层架构中的service+dao

服务的提供者部署形式:web工程

操作步骤:

1.在工程中配置一个service接口
2.在工程中添加service接口的实现类
3.配置spring和dubbo的整合文件
4.配置web工程的web.xml加载spring配置文件

3.1.1 创建接口

public interface HelloService {
    String SayHello(String name);
}

3.1.2 创建实现类

@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String SayHello(String name) {
        System.out.println("hello" + name);
        return "hello" + name;
    }
}

3.1.3配置整合文件

<!--配置dubbo和spring整合-->

<!--dubbo服务的应用名称-->
<dubbo:application name="dubbo_provide"></dubbo:application>

<!--配置注册中心   注意address后ip的前缀-->
<dubbo:registry address="zookeeper://***********:2181" ></dubbo:registry>

<!--配置协议类型   name:协议类型(dubbo) port:当前服务者暴露的端口 从20880开始-->
<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>

<!--dubbo注释的包扫描-->
<dubbo:annotation package="cn.itcast.service"></dubbo:annotation>

3.1.4配置web.xml

<!-- 监听器监听其他的spring配置文件 -->
<context-param>   
    <param-name>contextConfigLocation</param-name>   
    <param-value>classpath*:applicationContext.xml</param-value></context-param>
<listener>   
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

3.2 服务的消费者

服务的消费者:传统意义的web层(controller),需要使用dubbo的形式远程调用服务提供者

服务消费者:部署到一个web工程中

操作步骤:

1.编写一个controller
2.配置springmvc的配置文件
3.配置dubbo和spring整合的配置文件
4.配置web.xml配置文件

3.2.1编写controller

@Controller
public class HelloController {
    /**
     * Reference是dubbo提供的远程调用的注解
     *          表示需要远程调用服务者的HelloService服务
     */
    @Reference
    private HelloService helloService;
    @RequestMapping("/test")
    public @ResponseBody String test() {
        return helloService.SayHello("啦啦啦");
    }
}

3.2.2编写springmvc配置文件

    <!--mvc的配置-->
    <context:component-scan base-package="cn.itcast.web"></context:component-scan>
    <!--mvc的注解驱动-->
    <mvc:annotation-driven></mvc:annotation-driven>

3.2.3整合

<!--配置dubbo和spring整合-->

<!--dubbo服务的应用名称-->
<dubbo:application name="dubbo_provide"></dubbo:application>

<!--配置注册中心   注意address后ip的前缀-->
<dubbo:registry address="zookeeper://***********:2181" ></dubbo:registry>

<!--dubbo注释的包扫描-->
<dubbo:annotation package="cn.itcast.service"></dubbo:annotation>

3.2.4配置web.xml

	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

3.3 总结

将工程一分为二(controller的web工程,service的web工程)

和传统的写法极其相似

在提供者:使用dubbo提供的@Service暴露服务

在消费者:使用dubbo提供的@Reference(替换@Autowired)注解调用服务提供者

配置文件spring和dubbo整合:
配置应用名称 : 当前模块名
配置注册中心 : 配置zookeeper的完成请求路径
配置dubbo的包扫描 :  使用了dubbo注解所在的包
配置服务暴露的协议和端口 :  协议名称=dubbo,端口=20881开始 (配置到服务提供者)

3.4main方法启动提供者

public class DubboProvider {
	public static void main(String[] args) throws Exception {
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-web.xml");
		context.start();
		System.in.read(); // 按任意键退出
	}
}

4.云服务器使用dubbo–zookeeper注册中心

    <!--注册中心-->
    <dubbo:registry address="zookeeper://*****************:2181" ></dubbo:registry>

注意事项:

  1. zookeeper的地址为公网ip.
  2. 查看当前运行的端口:netstat -lanp

zookeeper的介绍:https://blog.csdn.net/java_66666/article/details/81015302

发布了24 篇原创文章 · 获赞 1 · 访问量 1798

猜你喜欢

转载自blog.csdn.net/weixin_42106658/article/details/94882063