Dubbo+ZooKeeper 微服务开发

Dubbo+ZooKeeper 微服务开发

1. 准备

  • 相关框架的版本,版本号推荐按下表配置,否则会出现dubbo和zk通信协议报错等各种异常情况
nameversion类型
Zookeeper3.9.2软件
Dubbo-Admin20240824软件
spring-boot3.3.2依赖库
spring-cloud2023.0.3依赖库
spring-cloud-alibaba2023.0.1.2依赖库
dubbo-spring-boot-starter3.3.0-beta.2依赖库
cubator-framework5.7.0依赖库
cubator-recipes5.7.0依赖库
curator-x-discovery-server5.7.0依赖库

1.1 Zookeeper搭建

本案例中Zookeeper仅作为服务发现组件使用,此处只部署单机zk

  • 基于Docker部署ZK服务
docker run -itd --name zk_server1 --network zk_net -p 2181:2181 -p 2888:2888 -p 3888:3888 zookeeper

1.2 Dubbo-Admin搭建

Dubbo-Admin是一个基于Zookeeper的服务监控项目,主要用于实时查看微服务的注册状态

  • 在Github上下载dubbo-admin项目

  • 启动dubbo-admin server服务

    • CMD下进入dubbo-admin根目录,执行mvn clean package生成各模块的jar包
    • 打包成功后进入dubbo-admin-distribution/target目录,运行dubbo-admin-x.x.x-SNAPSHOT.jar
  • 启动dubbo-admin-ui服务

    • 执行npm install
    • 执行npm run serve
    • 成功后访问 npm run serve打印的访问地址信息
  • 至此,dubbo-admin启动成功,如下图Dubbo-Admin-UI

1.3 基于Dubbo开发可通信的Order/User微服务

1.3.1 common-interface 公共接口模块开发

Dubbo推荐将RPC调用的接口统一放在一个interface模块以供服务提供者和服务消费者使用

  • common-interface模块 pom配置
	<properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.skymaple</groupId>
            <artifactId>dsd-common</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • RPC接口定义
public interface UserService {
    //该接口用于获取用户的发货地址信息,Address是实现了序列化接口的数据实体类
    public List<Address> getUserAddress();
}
1.3.2 User微服务开发(服务提供者)

该服务主要用于被Order服务调用

  • user-service模块 pom配置
	<properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.skymaple</groupId>
            <artifactId>dsd-interface</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <!-- spring starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- registry dependency -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.7.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-x-discovery-server -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery-server</artifactId>
            <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler-plugin.version}</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.21.0</version>
            </plugin>
        </plugins>
    </build>
  • 服务配置:application.yml
dubbo:
  application:
      name: dubbo-springboot-user-provider
      logger: slf4j
  protocol:
    port: 50055
    # 此处的协议使用dubbo,也可使用triple协议-tri
    name: dubbo
  registry:
    address: zookeeper://127.0.0.1:2181
#    address: nacos://${nacos.address:localhost}:8848?username=nacos&password=nacos
server:
  port: 10000
  • user服务提供者实现
//DubboService注解能将该service注册到application.yml指定的服务注册中心registry中,以便消费者查询服务注册中心并调用
@DubboService(group = "grp1",version = "1.0")
public class UserServiceImpl implements UserService {
    @Override
    public List<Address> getUserAddress() {
        Address zs = new Address(1,"zhhangsan","test");
        Address ls = new Address(2,"lisi","test");
        List<Address> list = Arrays.asList(zs, ls);
        System.out.println("call user service getUserAddress success:"+list.toString());
        return list;
    }
}
//在User服务的程序入口添加@EnableDubbo启动Dubbo功能
@EnableDubbo
@SpringBootApplication
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}
1.3.3 Order微服务开发(服务消费者)

该服务主要用于查询服务注册中心中的服务提供者并调用@DubboReference标记的接口

  • order-service模块 pom配置
	<properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.skymaple</groupId>
            <artifactId>dsd-interface</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-x-discovery-server</artifactId>
            <version>5.7.0</version>
        </dependency>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  • 服务配置:application.yml
server:
  port: 10001
dubbo:
  application:
    name: dubbo-springboot-order-consumer
    logger: slf4j
    qos-port: 33333
  registry:
    address: zookeeper://127.0.0.1:2181
#    address: nacos://${nacos.address:localhost}:8848?username=nacos&password=nacos
  • order服务消费者实现
@RestController
public class ComsumerController {
    //DubboReference注解能从服务注册中心registry中查询到相应的服务提供者接口并注入本地bean
    @DubboReference(group = "grp1",version = "1.0",check = false)
    private UserService userServiceV1;

    @GetMapping("/useraddr")
    @ResponseBody
    public String getUserAddress(){
        return userServiceV1.getUserAddress().toString();
    }
}
//在Order服务的程序入口添加@EnableDubbo启动Dubbo功能
@EnableDubbo
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}

----- 至此,基于Dubbo的微服务基础开发工作已经完成-----

FAQ

  • dubbo 消费者启动报错:no class found xxx/protobuf
    • 解决:protobuf缺失—pom中加上protobuf的依赖
  • Failed to deserialize triple response, service=org.apache.dubbo.remoting.transport.netty4.NettyConnectionClient ,This may be caused by , go to https://dubbo.apache.org/faq/4/14 to find instructions
    • 解决:根据dubbo官方推荐的ZK依赖版本、ZK服务版本进行开发和部署
Spring Boot是一个开源的Java框架,用于快速构建独立的、基于Spring的应用程序。它简化了Spring应用程序的配置和部署过程,并提供了许多嵌入式服务器,如Tomcat、Jetty等。Spring Boot还提供了自动配置的特性,可以根据类路径中的依赖自动配置Spring应用程序。 Dubbo是一款高性能的分布式服务框架,也是阿里巴巴开源的项目。它提供了服务治理、远程通讯和分布式调用等功能,帮助开发人员轻松构建分布式服务化的应用。 Zookeeper是一个开源的分布式协调服务,可以用于实现分布式应用程序的一致性和可靠性。它提供了一个类似于文件系统的层次化的命名空间,并允许开发人员注册、协调和共享各种资源,如配置信息、服务注册和发现等。 当使用Spring Boot结合DubboZookeeper时,可以构建一个高性能、可扩展和可靠的微服务架构。Spring Boot提供了便利的开发和部署方式,Dubbo提供了分布式服务框架的支持,而Zookeeper则提供了分布式协调服务。开发人员可以使用Spring Boot快速构建独立的微服务应用程序,使用Dubbo进行服务间的通信和管理,同时通过Zookeeper进行服务的注册和发现。这样的架构可以方便地实现微服务架构中的资源共享和服务治理等功能,大大简化了开发人员的负担。 综上所述,Spring Boot结合DubboZookeeper可以构建高效、可靠的微服务架构,并提供了便利的开发和部署方式,帮助开发人员构建高性能的分布式应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值