微服务基础理论

一.  系统架构的演变

1.1 单体架构

单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。

 存在的问题:

  • 代码耦合
  • 迭代困难
  • 扩展受限
  • 技术债务

1.2 分布式架构

分布式:需要按照功能点把系统拆分,拆分成独立的功能,单独为某一个节点添加服务器,需要系统之间配合才能完成整个业务逻辑。

 存在的问题:

  • 模块之间有一些通用的业务逻辑无法共用

1.3 soa架构

SOA:Service Oriented Architecture(面向服务的架构)。也就是把工程拆分成服务层,表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现,使用ESB(Enterparise Servce Bus企业服务总线,代表技术:Mule、WSO2)提供表现层和服务层之间的交互。

 存在的问题:

  • 不支持集群、臃肿
  • 提供者和消费者耦合度太高
  • 抽取服务的粒度太大

二.  dubbox框架

2.1 dubbox简介

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

2.2 dubboX架构

节点角色说明:

Provider: 暴露服务的服务提供方。

Container: 服务运行容器。

Registry: 服务注册与发现的注册中心。

Consumer: 调用远程服务的服务消费方。

Monitor: 统计服务的调用次调和调用时间的监控中心。

调用关系说明:        

0. 服务容器负责启动,加载,运行服务提供者。

1. 服务提供者在启动时,向注册中心注册自己提供的服务。

2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

三.  注册中心zookeeper

3.1 zookeeper介绍

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

 3.2 zookeeper的安装(linux系统下安装,前提已经安装过jdk)

  • 上传并解压缩zookeeper压缩包

tar -zxvf zookeeper-3.4.11.tar.gz -C /usr/local

  • 将conf文件夹下zoo_sample.cfg复制一份,改名为zoo.cfg

cd /usr/local/zookeeper-3.4.11/conf

cp zoo_sample.cfg zoo.cfg 

  • 修改配置dataDir属性,指定一个真实目录

cd /usr/local/zookeeper-3.4.11

mkdir data 

  • 打开 zoo.cfg ,  修改 data 属性:dataDir=/usr/local/zookeeper-3.4.11/data 

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 

 三. dubbox案例

3.1 创建父工程 dubbox_parent

 

  • 在父工程的pom.xml中添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>
    
    <groupId>com.bjpowernode</groupId>
    <artifactId>dubbox_parent</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.1.0</version>
        </dependency>
        <!-- 由于使⽤了zookeeper作为注册中⼼,则需要加⼊zookeeper的客户端jar包: -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
    </dependencies>
</project>

 3.2 创建公共接口模块 dubbox_interface

  •  pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbox_parent</artifactId>
        <groupId>com.bjpowernode</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbox_interface</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>
  •  service 定义一个接口
package com.bjpowernde.service;

public interface HelloService {
    String hello();
}

  3.3 定义服务提供方 dubbox_provider

  •  pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbox_parent</artifactId>
        <groupId>com.bjpowernode</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbox_provider</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>dubbox_interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
  • 配置文件:application.yml
server:
  port: 8081
dubbo:
  #zookeeper地址
  registry:
    address: zookeeper://192.168.128.129:2181
  #当前服务的名称,监控中心统计服务的调用次数和调用时间
  application:
    name: dubbox-provider
  #协议:Dubbo支持的协议(Dubbo,PEI,http,WebService)
  protocol:
    name: dubbo
  • serviceImpl(类上面的注解不要选错,是alibaba包下的)
  • @service:将此类注入到容器中并将该服务注册到zookeeper中
package com.bjpowernode;

import com.alibaba.dubbo.config.annotation.Service;
import com.bjpowernde.service.HelloService;

@Service
public class HelloServiceImpl implements HelloService {
    @Override
    public String hello() {
        return "hello,世界你好!";
    }
}
  • 启动类App
package com.bjpowernode;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo //dubbo注解生效
public class DubboxProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(DubboxProviderApp.class,args);
    }
}

  3.4 定义服务消费方 dubbox_consumer

  •  pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbox_parent</artifactId>
        <groupId>com.bjpowernode</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbox_consumer</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.bjpowernode</groupId>
            <artifactId>dubbox_interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>
  • 配置文件:application.yml
server:
  port: 8080
dubbo:
  #zookeeper地址
  registry:
    address: zookeeper://192.168.128.129:2181
  #当前服务的名称,监控中心统计服务的调用次数和调用时间
  application:
    name: dubbox-consumer
  #协议:Dubbo支持的协议(Dubbo,PEI,http,WebService)
  protocol:
    name: dubbo
  • controller(公共接口的注解不要选错@Reference)
package com.bjpowernode.Controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.bjpowernde.service.HelloService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @Reference
    private HelloService helloService;

    @GetMapping("/hello")
    public String hello(){
        return helloService.hello();
    }
}
  • 启动类App
package com.bjpowernode;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubbo //dubbo注解扫描
@SpringBootApplication
public class DubboxConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(DubboxConsumerApp.class,args);
    }
}

  3.5 启动测试

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值