0
点赞
收藏
分享

微信扫一扫

(优医健康)项目所需知识:微服务基础理论,微服务架构,dubbox框架,注册中心 zookeeper,dubbox入门案例

目标践行者 2022-03-13 阅读 37

文章目录

1.1 微服务基础理论

1.1.1 背景

2008年以后,国内互联网行业飞速发展,我们对软件系统的需求已经不再是过去”能用就行”这种很low的档次了,像抢红包、双十一这样的活动不断逼迫我们去突破软件系统的性能上限,传统的IT企业”能用就行”的开发思想已经不能满足互联网高并发、大流量的性能要求。系统架构走向分布式已经是服务器开发领域解决该问题唯一的出路,然而分布式系统由于天生的复杂度,并不像开发单体应用一样把框架一堆就能搞定,因此各大互联网公司都在投入技术力量研发自己的基础设施。这里面比较有名的如阿里的开源项目dubbo, Netflix开发的一系列服务框架。

1.1.2 系统架构的演变

1.1.2.1 单体架构

单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。
在这里插入图片描述
存在的问题:
 代码耦合:模块的边界模糊、依赖关系不清晰,整个项目非常复杂,每次修改代码都心惊胆战
 迭代困难:每次功能的变更或bug的修复都会导致重新部署整个应用,随着代码的增多,构建、测试和部署的时间也会增加
 扩展受限:单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩
 技术债务:随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多不坏不修
 阻碍创新:单体应用往往使用统一的技术平台或方案解决所有的问题,要想引入新技术平台会非常困难

1.1.2.2 分布式架构

分布式:需要按照功能点把系统拆分,拆分成独立的功能,单独为某一个节点添加服务器,需要系统之间配合才能完成整个业务逻辑。
在这里插入图片描述
分布式架构优点:
 不同的团队负责不同的子项目
 可以灵活的进行分布式部署
 可以为某一模块单独加集群
分布式架构缺点:
 模块之间有一些通用的业务逻辑无法共用。

1.1.2.3 soa架构

SOA:Service Oriented Architecture(面向服务的架构)。也就是把工程拆分成服务层,表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现,使用ESB(Enterparise Servce Bus企业服务总线,代表技术:Mule、WSO2)提供表现层和服务层之间的交互。
在这里插入图片描述
存在的问题:
 不支持集群、臃肿

1.1.2.4 微服务架构

微服务就是一个轻量级的服务治理方案。
代表技术:Eureka、zookeeper 等等
在这里插入图片描述

1.2 dubbox框架

1.2.1 dubbox简介

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个基于Java的高性能RPC(Remote Procedure Call)框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。后期阿里巴巴停止了该项目的维护,于是当当网在这之上推出了自己的Dubbox。

1.2.2 dubboX架构

在这里插入图片描述
节点角色说明:
Provider: 暴露服务的服务提供方。
Container: 服务运行容器。
Registry: 服务注册与发现的注册中心。
Consumer: 调用远程服务的服务消费方。
Monitor: 统计服务的调用次调和调用时间的监控中心。

调用关系说明:

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

1.3注册中心 zookeeper

1.3.1 zookeeper介绍

Zookeeper是Apacahe Hadoop的子项目,可以为分布式应用程序协调服务,适合作为Dubbo服务的注册中心,负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互。

在这里插入图片描述

1.3.2 zookeeper的安装(Linux)

1、安装jdk
2、上传并解压缩zookeeper压缩包
tar -zxvf zookeeper-3.4.11.tar.gz -C /usr/java
3、将conf文件夹下zoo_sample.cfg复制一份,改名为zoo.cfg
cd /usr/java/zookeeper-3.4.11/conf
cp zoo_sample.cfg zoo.cfg
4、修改配置dataDir属性,指定一个真实目录
cd /usr/java/zookeeper-3.4.11
mkdir data
打开 zoo.cfg , 修改 data 属性:dataDir=/usr/java/zookeeper-3.4.11/data

1.3.3 启动zookeeper

进入 bin 目录,启动服务输入命令
./zkServer.sh star
输出以下内容表示启动成功
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
关闭服务输入命令
./zkServer.sh stop
查看服务状态
./zkServer.sh status
如果是启动状态则是以下提示
JMX enabled by default Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: standalone

Window下 直接下载安装包 进入bin运行zKServer.cmd就可以

1.4 dubbox入门案例

1.4.1 创建父工程

在这里插入图片描述

在父工程的pom.xml中添加依赖

<properties>
    <spring.version>5.0.5.RELEASE</spring.version>
</properties>
<dependencies>
    <!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- dubbo依赖 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.8.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.6</version>
    </dependency>
    <dependency>
        <groupId>com.github.sgroschupf</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.1</version>
    </dependency>
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.11.0.GA</version>
    </dependency>
</dependencies>

1.4.2 定义公共接口

1.4.2.1 创建公共接口模块

在这里插入图片描述

1.4.2.2 创建公共接口

public interface UserService {
    public String getName();
}

1.4.3定义服务提供方

1.4.3.1 创建服务提供方模块

在这里插入图片描述

点击Next
在这里插入图片描述

点击next

1.4.3.2.创建pom.xml

<dependencies>
    <dependency>
        <groupId>com.qf</groupId>
        <artifactId>dubbox_interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <port>8081</port>
                <path>/</path>
            </configuration>
        </plugin>
    </plugins>
</build>

1.4.3.3 创建service

import com.alibaba.dubbo.config.annotation.Service;
//import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
    @Override
    public String getName() {
        return "hello,Dubbox.......";
    }
}

1.4.2.4 创建配置文件

创建applicationContext-service.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:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.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.qf.service"></context:component-scan>-->
    <!-- 用于配置当前应用名,不管该应用是提供者还是消费者 -->
    <dubbo:application name="dubbo-service"/>
    <!--注册中心地址,与zookeeper端口保持一致 -->
    <dubbo:registry address="zookeeper://192.168.204.130:2181"/>
    <!-- 用dubbo协议在20880端口暴露服务
        name:传输协议,Dubbo支持的协议有Dubbo、RMI、http、WebService
        port:端口,其他应用可以通过这个端口调用服务
     -->
    <dubbo:protocol name="dubbo" port="28080"/>
    <!--发布服务
        interface:暴露了UserService接口
        ref:引用了 Spring 中名为 userServiceImpl 的类
    -->
    <!--<dubbo:service interface="com.qf.service.UserService" ref="userServiceImpl"></dubbo:service>-->
    <!--批量扫描,发布服务-->
    <dubbo:annotation package="com.qf.service"/>
</beans>

1.4.3.5 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
  <!-- 加载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>
</web-app>

1.4.4 定义服务消费方

1.4.4.1 创建服务消费方模块

在这里插入图片描述

1.4.4.2.创建pom.xml

<dependencies>
    <dependency>
        <groupId>com.qf</groupId>
        <artifactId>dubbox_interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <port>8080</port>
                <path>/</path>
            </configuration>
        </plugin>
    </plugins>
</build>

1.4.4.3 定义controller

@Controller
@RequestMapping("/user")
public class UserController {

    @Reference
//@Autowired
   private UserService userService;

    @RequestMapping("/getName")
    @ResponseBody
    public String getName() {
        return userService.getName();
    }
}

注意:Controller中注入HelloService使用的是Dubbo提供的@Reference注解

1.4.3.4 配置springmvc.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:dubbo="http://code.alibabatech.com/schema/dubbo"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.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.qf.controller" />-->
    <mvc:annotation-driven />
    <dubbo:application name="dubbo-consumer"/>
    <dubbo:registry address="zookeeper://192.168.204.130:2181"/>
    <!--引用服务
        interface:和服务提供者的暴露的服务类型保持一致
        id:消费方可以直接通过该id注入接口实例到controller
    -->
    <!--<dubbo:reference interface="com.qf.service.UserService" id="userService" />-->
    <!--spring支持@Reference-->
    <dubbo:annotation package="com.qf.controller"></dubbo:annotation>
</beans>

1.4.3.5 定义web.xml

<?xml version="1.0" encoding="UTF-8"?>

CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 ```cpp forceEncoding true CharacterEncodingFilter /* springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml springmvc *.do ```

1.4.4 启动测试

  1. 注意:先install父工程(大war包要去父工程找依赖的版本号)
  2. 先启动服务提供方再启动服务消费方
  3. 访问: http://localhost:8080/user/getName.do

在这里插入图片描述

1.4.5 idea安装zookeeper插件

1.4.5.1搜索zookeeper插件

在这里插入图片描述

1.4.5.2.配置zookeeper插件

在这里插入图片描述

1.4.5.3.使用zookeeper插件

在这里插入图片描述

举报

相关推荐

0 条评论