springboot 整合dubbo 微服务,zookeeper作为注册中心

本文详细介绍了微服务架构的优势,如解决单机性能瓶颈问题,以及如何通过Dubbo实现服务注册与发现。文中还演示了Windows环境下Zookeeper的安装,dubbo-admin的部署,以及遇到的端口冲突问题的解决。接着,创建了Dubbo服务提供者和消费者项目,通过Spring Initializer创建,并配置了相关依赖,实现了服务的注册、监控和远程调用。最后,通过测试验证了远程调用的成功。
摘要由CSDN通过智能技术生成

参考视频:狂神说-微服务

微服务架构的优点:

在单机上面部署多个服务有明显的弊端,性能受到单台服务器性能的限制。当业务规模扩大时,对单机的服务器性能的要求越来越高。而单机的服务器内存扩容,CPU核心数增加,硬盘扩容是有一定风险的,可能会影响到线上业务的稳定性,甚至升级不慎可能导致数据丢失,并且升级的费用也比较高昂。微服务的架构很好的解决了这个问题,当业务扩展时,可以横向增加服务器的数量,让服务运行在多台服务器上面,对于用户来讲,调用服务被平均分发到了每台服务器上面,就和在单台服务器上面访问一样,没有感觉到差异。

在初始化阶段,dubbo服务首先在容器内启动,服务提供者provider启动,并且像Registry服务中心注册,同时dubbo消费者向注册中心订阅服务,注册中心有可用的服务,将通知消费者,消费者远程调用服务,这一个过程都可以被Monitor监控服务的运行情况,并作出相应的统计。

Windows下面安装zookeeper

在zookeeper官网上面下载 zookeeper下载

下载到本地解压,在conf 文件夹下面复制zoo_zample.cfg 重命名为zoo.cfg,:

 启动zookeeper服务器端和客户端,在bin目录下面双击zkServer.cmd 启动服务端

 双击zkCli.cmd 启动客户端

 下载dubbo-admin ,实现监控 git clone https://github.com/apache/dubbo-admin.git,选择master-0.2分支,来下载,因为这个分支比较简单。

进入dubbo-admin-server 在dubbo-admin\dubbo-admin-server\src\main\resources目录下面的 application.yml文件确认配置,可以看到注册中心,配置中心,元数据中心都在本机的2181端口上运行,登陆监控页面的用户名和密码一样都是root

 进入 dubbo-admin-server 目录进行打包,执行命令

mvn clean package -Dmaven.test.skip=true

 打包失败,提示需要maven版本3.2.5,使用mvn -v 查看版本,我的本地版本是3.2.2需要升级一下版本

 安装maven最新版本3.8.5,然后重新打包,打包成功

在targer文件夹下面看到生成了jar,启动项目

java -jar dubbo-admin-server-0.4.0.jar

由于8080端口被占用,启动失败

 查询是哪一个进程占据了端口

netstat -ano|findstr "8080"

 可以看到是pid为74660的进程占用了8080端口

查看是那个应用占用了8080端口 

tasklist|findstr "74660"

 

taskkill /pid 74460 -f #杀掉进程

杀掉进程后仍然不能启动,查找了一下资料, 有可能是zookeeper占用了端口,zookeeper最近的版本中有个内嵌的管理控制台是通过jetty启动,也会占用8080 端口,修改端口号为8888,我们在zoo.cfg中添加:

admin.serverPort=8888

然后再重新启动:

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

 启动成功,在浏览器里面输入http://localhost:7001/,可以在这个页面看到服务器提供者,和消费者的情况

 接下来分别创建两个spring项目来作为服务提供者provider,和消费者consumer

选择file→New→Module

 选择Spring Initializer 创建一个spring项目,

修改Group,ArtifictId,选择jdk版本,修改package名称,选择下一步 

 

 勾选web,选择Spring Web,选择next,最后点击finish

 创建好provider,在项目下面的pom.xml 中需要引入相关的依赖,有Zookeeper,zkclient,curator-framework,curator-recipes ,这些依赖是用来完成与zookeeper中心服务注册的,provider在项目启动后,会想zookeeper注册中心注册,其中zookeeper的依赖中要去除slf4j-logrj12,以免jar包冲突。

        <!-- 添加zookeeper 依赖 -->
        <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <!-- 排除自带的slf4j-log4j12 -->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </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>

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

在application.properties 完成注册中心地址配置,provider服务名称配置,服务的运行端口,那些服务需要扫描,配置

server.port=7000
# 配置zookeeper注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 应用名称
dubbo.application.name=provider
# 哪些服务要被注册,扫描
dubbo.scan.base-packages=com.jx.service

 定义一个接口SayHello.java,然后新建一个Hello.java 实现这个接口,这个服务的功能就是返回“hello”字符串

package com.jx.service;

import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
// 实现类
@Service
@Component
public class Hello implements SayHello{

    @Override
    public String sayHello() {
        System.out.println("hello");
        return "hello ";
    }
}
package com.jx.service;
// 接口
public interface SayHello {

    String sayHello();
}

注意:这里的@Service 注解使用的是 dubbo下面的注解,这个注解表示这个实现类是dubbo服务

运行主方法,会自动将服务注册到zookeeper上面,可以在dubbo-admin上面看到服务的运行。

 同样的创建方式,我们在创建一个consume应用

只需要修改application.properties当中的服务名称

server.port=7000
# 配置zookeeper注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 应用名称
dubbo.application.name=consumer
# 哪些服务要被注册,扫描
dubbo.scan.base-packages=com.jx.service

然后编写方法,远程调用服务端的服务,这里面有两种方式,一种是保持和provider项目中的相同的接口路径,就是也在 consumer项目的com.jx 下面,将provider的接口复制过来,保证都是在com.jx.service下面

然后编写消费者SayHelloServie,远程调用provider的SayHello接口,相当于是在本地调用这个接口,实际上面在远程服务器上面执行这个动作,就是在consumer上面调用SayHello接口,实际执行的是provider服务提供者上面的SayHello 接口,然后provider将执行结果通过网络传输,返回给consumer。

package com.jx.service;

import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

@Service
public class SayHelloService {

    @Reference
    SayHello sayHello;

    public String say(){

        return sayHello.sayHello();
    }
}
 

在consumer中的test目录下面的编写一个测试,调用远程方法

package com.jx;

import com.jx.service.SayHelloService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ConsumerApplicationTests {

    @Autowired
    SayHelloService sayHelloService;

    @Test
    void contextLoads() {
        String words = sayHelloService.say();
        System.out.println(words);
    }

}

运行这个测试类,返回“hello”,表示远程调用成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值