springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 新年第一篇博文,接着和大家分享springcloud相关内容;本次主要内容是使用cloud结合zookeeper作为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka作为注册中心,有兴趣的朋友会回顾下上几篇文章。

新年第一篇博文,接着和大家分享springcloud相关内容;本次主要内容是使用cloud结合zookeeper作为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka作为注册中心,有兴趣的朋友会回顾下上几篇文章。


springcloud版本说明

由于市面上其版本比较多,版本不一可能造成了读者尝试时版本问题,所以这里指明当前作者写文章时使用的cloud版本
springboot版本:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

springcloud版本:

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>

docker快速启动一个zookeeper服务

就我个人而言通常使用docker来运行启动一些第三方的服务,这里也用她来启动zk,首先pull镜像:

docker pull zookeeper
docker run --name zookeeper -p 2081:2181 -d zookeeper
docker logs dd51008f9f8f

一般采用默认镜像的配置即可启动,这里来看下启动后logs日志的部分截图:
image
能够看到镜像启动时读取了内置的zoo.cfg配置文件,并且zookeeper当前版本是3.4

我们使用可视化工具ZooInspector连接zookeeper,能够直观的看到如下默认节点信息:
image

目前看我们只有一个node节点,试想一下如果用zk作为注册中心,这里应该会有至少两个大节点,一个服务提供这节点,一个消费者注册的节点,下面会通过程序来创建。

zk-server服务提供者

在zk-server工程中,这里先创建zk的服务提供者节点,在pom工程中需要如下配置:

        <!--zk-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>
        <!--zk工具包-->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.13</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

上面pom分了两步,第一个是springcloud使用zk做服务注册发现用的,第二个相当于连接zk服务的客户端包;然后在程序启动入口出增加注解 @EnableDiscoveryClient

值得注意的是这里指定了zk服务的版本号3.4.13,就目前个人遇到的情况看,连接zk的客户端尽量和zk服务端版本保持一致,避免造成版本问题

作为一个服务提供端(server),我们还需要有一个暴露出去的接口服务,我这里定义如下接口:

@RestController
public class UserController {

    @Value("${server.port}")
    private int port;

    @GetMapping("/list")
    public List<MoUser> getList() {

        return new ArrayList<MoUser>() {
            {
                add(new MoUser(1, "shenniu001_" + port));
                add(new MoUser(2, "shenniu002_" + port));
                add(new MoUser(3, "shenniu003_" + port));
            }
        };
    }
}

通过接口把服务启动的端口返回出去,来达到区分不同接口的作用。有了接口代码后,还剩下连接zk服务的一些列配置,application.yml中的配置信息如:

spring:
  application:
    name: zk-server
  cloud:
    zookeeper:
      connect-string: localhost:2081
      discovery:
        register: true
        enabled: true
        instance-id: 1
        root: /shenniu
server:
  port: 6061

参数的简单说明:

  1. connect-string:连接zk服务的连接串
  2. register: 是否启动服务注册
  3. instance-id: zk唯一id的标识
  4. root: zk根节点名称,默认/services

有了如上的配置,我们就能够启动zk-server程序了;首先访问暴露的接口正常:
image

然后再查看可视化视图工具ZooInsector有如下新增信息:
image

这个时候能够说明zk-server服务往zk服务端注册成功了,zk服务端节点上包含了zk-server服务的一些基本信息,如:ip,端口,名称;这些是服务注册与发现的基本信息

zk-client服务消费者

在zk-client工程中,服务消费者的pom配置与生产者很像,这里为了方便用了feign来访问服务端,如下pom配置:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.13</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

同样需要执行具体的zk服务端的版本,以及排除冲突的log包;因为用了feign工具来访问,所以需要在程序入口出增加如下注解:

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ZkClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZkClientApplication.class, args);
    }
}

然后创建一个service层并创建接口IUserService,通过@FeignClient注解的实现访问服务提供者的接口:

@Service
@FeignClient("zk-server")
public interface IUserService {
    @GetMapping("/list")
    List<MoUser> getList();
}

zk-client端我想把服务提供端zk-server返回的信息直接输出到浏览器上,如下代码:

@RestController
public class UserController {

    @Autowired
    protected IUserService userService;

    @GetMapping("/list")
    public List<MoUser> getList() {
        return userService.getList();
    }
}

来到这里,剩余的就是在application.yml中配置连接zk服务端的配置:

spring:
  application:
    name: zk-client
  cloud:
    zookeeper:
      connect-string: localhost:2081
      discovery:
        register: true
        enabled: true
        instance-id: 1
        root: /shenniu
server:
  port: 7061

如果细心能够发现zk-client和zk-server的zk服务配置信息基本一致,其实不管是服务提供者还是服务消费者,都是作为zk服务的客户端来使用,并且都把自己的服务访问信息上传注册给zookeeper注册中心的

启动zk-client项目,访问接口能够成功响应出zk-server接口返回的信息:
image

启动多个zk-server服务提供者

上面一个zk-server(服务提供者),一个zk-client(服务消费者)在实际场景中很少见,一般服务提供者都是部署在多台机子或虚拟机中(当然zk服务集群不在本次考虑范围),因此这里通过idea启动多个不同端口的zk-server来实验下并测试feign的负载均衡是否可用。

分别启动6061,6062,6063的zk-server端口服务,这里我注释了instance-id: 1节点,采用自动生成的id:
image

然后在浏览器中访问zk-client,刷新多次看下接口返回信息,能够看到轮询效果:
3

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
1月前
|
存储 数据可视化 Java
基于MicrometerTracing门面和Zipkin实现集成springcloud2023的服务追踪
Sleuth将会停止维护,Sleuth最新版本也只支持springboot2。作为替代可以使用MicrometerTracing在微服务中作为服务追踪的工具。
91 1
|
6天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
34 3
|
1月前
|
消息中间件 监控 Ubuntu
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
72 3
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
|
1月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
79 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
2月前
|
消息中间件 存储 Java
SpringCloud基础9——服务异步通信-高级篇
消息可靠性、死信交换机、惰性队列、MQ集群
SpringCloud基础9——服务异步通信-高级篇
|
2月前
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
56 1
|
2月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
3月前
|
负载均衡 监控 Java
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
SpringCloud常见面试题(一):SpringCloud 5大组件,服务注册和发现,nacos与eureka区别,服务雪崩、服务熔断、服务降级,微服务监控
|
3月前
|
XML Java 数据格式
Spring Cloud全解析:注册中心之zookeeper注册中心
使用ZooKeeper作为Spring Cloud的注册中心无需单独部署服务器,直接利用ZooKeeper服务端功能。项目通过`spring-cloud-starter-zookeeper-discovery`依赖实现服务注册与发现。配置文件指定连接地址,如`localhost:2181`。启动应用后,服务自动注册到ZooKeeper的`/services`路径下,形成临时节点,包含服务实例信息。
300 3
|
3月前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心