Dubbo

210 阅读3分钟

服务治理框架,RPC框架

  • 最早jdk就有RMI
  • 单体应用,部分模块导致FullGC 会全盘失败。测试成本高。不能跨语言。
  • 啥是架构。技术选型,成本预算,人员分配,风险控制。经验积累
  • SOA面向服务架构。
  • 两个模块交换数据
    • 用过mysql
    • XML webservice SOAP CXF
    • json 比xml小,解析快。但结构不严谨
    • 对象序列化,文件格式最小(二进制)效率最高。但无可读性。不跨平台。

  • 服务治理
  • 注册中心

架构

  • provider启动的时候向注册中心注册。提供自己的IP,接口,方法,版本等。
  • consumer向注册中心拿自己要的东西。
  • 注册中心给consumer provider的列表。列表发生变化的时候,通过长连接通知consumer变化。
  • consumer从注册中心提供的provider列表选择一个进行消费(软负载均衡),如果失败选择另一台。
  • provider和consumer在内存中记录服务的调用次数和调用时间,定时发给monitor

demo

<?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.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.obsidian</groupId>
    <artifactId>dubbo-producer</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <dubbo.version>2.7.3</dubbo.version>
        <spring-boot.version>2.1.7.RELEASE</spring-boot.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Aapche Dubbo  -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>javax.servlet</groupId>
                        <artifactId>servlet-api</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.2.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
dubbo:
  protocol:
    port: 12345
    name: dubbo
  scan:
    base-packages:
      com.obsidian.dubboproducer.service

  registry:
    address: zookeeper://node2:2181,node3:2181,node4:2181

spring:
  application:
    name: dubbo-provider
// provider
@Service(version = "1.0.0", interfaceClass = DemoProvider.class, timeout = 5000)
public class DemoProviderImpl implements DemoProvider {
    @Override
    public String say(String name) {
        return "hi: " + name;
    }
}
// consumer
@RestController
public class MainController {
    @Reference(version = "1.0.0")
    private DemoService demoService;

    @RequestMapping("main")
    public String say() {
        return demoService.say("李四");
    }
}
//consumer配置文件
spring:
  application:
    name: DemoConsumer

dubbo:
  registry:
    address: zookeeper://node2:2181,node3:2181,node4:2181

在ZK中能看到provider

dubbo admin

  • 下载代码: git clone https://github.com/apache/dubbo-admin.git
  • dubbo-admin-server/src/main/resources/application.properties中指定注册中心地址。或者在启动jar包的时候 跟配置。ZK的配置。
  • mvn clean package
  • java -jar dubbo-admin-0.1.jar --admin.registry.address=zookeeper://node2:2181 --admin.config-center=zookeeper://node2:2181 --admin.metadata-report.address=zookeeper://node2:2181
  • 启动后效果