美文网首页
zookeeper替代Eureka

zookeeper替代Eureka

作者: liangxifeng833 | 来源:发表于2020-08-12 12:11 被阅读0次

因为Eureka已经闭源了, 所以可以使用zookeeper替代.
注册中心目的: 服务治理, 服务注册, 服务发现与负载均衡. 当然zookeeper也有同样的功能.

zookeeper

  • 是分布式协调工具
  • 可以实现注册中心
  • 没有服务保护机制

安装zookeeper

编写会员服务并将会员服务注册到zookeeper

  • 新建member的springboot项目
  • 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 https://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.0.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>lxf</groupId>
    <artifactId>member</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>member</name>
    <description>Demo project for Spring Boot</description>

    <dependencyManagement>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- eureka客户端依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

    <repositories>
        <!-- 从指定库中获取依赖
        注意:要修改maven的setttings.xml 如下:
         <mirrorOf>*,!spring-milestones</mirrorOf>
          表示maven除了spring-milestones以外全部从settings配置的仓库中获取依赖-->
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>


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

</project>
  • 项目启动入口 MemberApplication.java:
  package lxf.member;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
//@EnableDiscoveryClient 作用是使用zookeeper或connsul作为注册中心所用
//向注册中心注册服务
@EnableDiscoveryClient
public class MemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(MemberApplication.class, args);
    }
  • application.yml 配置文件:
###服务别名--该服务注册到服务中心的名称
spring:
  application:
    name: zk-member
  profiles:
    active: member1
  • application-member1.yml 配置文件:
server:
  port: 8101
spring:
  cloud:
    zookeeper:
      ###当前会员服务注册到zookeeper注册中心
      connect-string: 127.0.0.1:2181
  • application-member2.yml 配置文件:
server:
  port: 8102
spring:
  cloud:
    zookeeper:
      ###当前会员服务注册到zookeeper注册中心
      connect-string: 127.0.0.1:2181
  • 创建api接口:
      package lxf.member.api;
    
      import org.springframework.beans.factory.annotation.Value;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RestController;
    
      @RestController
      public class MemberApiController {
          @Value("${server.port}")
          private String serverPort;
          @GetMapping("/getMember")
          public String getMember() {
          return "I am member! server port = "+serverPort;
          }
      }
    
  • 启动member后, 从zookeeper可视化工具中就可以看到注册的member服务了.

zookeeper可视化工具 zkui

  • 安装使用请参考
  • 我的下载解压后的目录是
      cd /usr/local/zkui-master
      mvn clean install
      //进入到生成jar包目录
      cd target 
      //启动服务
      java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar
    
  • 启动zkui后,浏览器访问:http://localhost:9090,默认登录账号密码如下:
      username:admin
      password:manager
    
  • 启动zookeeper和member服务后访问zkui, 出现如下两张图效果代表注册成功。

创建order服务

  • pom以来与member完全一致
  • 项目入口文件OrderApplication.java内容如下:
package lxf.member;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
//@EnableDiscoveryClient 作用是使用zookeeper或connsul作为注册中心所用
//向注册中心注册服务
@EnableDiscoveryClient
public class MemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(MemberApplication.class, args);
    }
}
  • application.yml配置文件:
server:
  port: 8103
###服务别名--该服务注册到服务中心的名称
spring:
  application:
    name: zk-order
  cloud:
    zookeeper:
      ###当前会员服务注册到zookeeper注册中心
      connect-string: 127.0.0.1:2181
  • api接口 OrderApiController.java,通过会员服务在zookeeper中注册的服务别名zk-member访问会员服务接口
package lxf.order.api;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class OrderApiController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getOrder")
    public String getOrder(){
        //两种方式调用member服务接口,一种是直接通过member ipd地址调用,另一种是通过注册中心获取member的ip地址然后调用
        //String res = restTemplate.getForObject("http://127.0.0.1:8101/getMember",String.class);
        //使用别名的方式请求member服务接口
        String res = restTemplate.getForObject("http://zk-member/getMember",String.class);
        System.out.println("订单服务调用会员服务getMember结果res="+res);
        return res;
    }
}

详细代码地址:https://github.com/liangxifeng833/springcloud/tree/master/zookeeper

通过DiscoveryClient获取服务中心数据\

  • OrderApiController.java中增加:
    @Autowired
    private DiscoveryClient discoveryClient
    /**
     * 可以获取服务中心的服务列表等数据
     * @return
     */
    @RequestMapping("/discoveryClientMember")
    public List<ServiceInstance> discoveryClientMember() {
        List<ServiceInstance> instance = discoveryClient.getInstances("zk-member");
        for (ServiceInstance serviceInstance : instance) {
            System.out.println("zk-member url:"+serviceInstance.getUri());
        }
        return instance;
    }

注册中心产品

  • Eureka闭源
  • Zookeeper
  • Consul 的使用方式除了maven依赖和yml配置不同,其他完全一致。

相关文章

网友评论

      本文标题:zookeeper替代Eureka

      本文链接:https://www.haomeiwen.com/subject/cvnaohtx.html