springcloud學習-09 zookeeper註冊中心【周陽springcloud2020學習筆記】

zookeeper是一個分佈式協調工具,可以實現註冊中心功能
關閉Linux服務器防火牆後啓動zookeeper服務器
zookeeper服務器取代Eureka服務器,zk作爲服務註冊中心

提供者 8003
1.新建module:zk-provider-payment8003
2.pom

    <dependencies>

            <!-- zookeeper -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            </dependency>

            <!--公共模塊:通用工具包-->
            <dependency>
                <groupId>cn.chen.demo</groupId>
                <artifactId>api-common</artifactId>
                <version>${project.version}</version>
            </dependency>

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

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

            <!-- devtools -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>

            <!-- lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>

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

        </dependencies>

3.yml

    server:
      port: 8003

    spring:
      application:
        name: zk-provider-payment
      cloud:
        zookeeper:
          connect-string: 192.168.221.129:2181 #zk註冊中心地址

4.主啓動

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

5.業務類

    @RestController
    @RequestMapping("/payment")
    public class PaymentController {

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

        @GetMapping("/zk/test")
        public String test(){
            return "zk port:" + serverPort + new Date();
        }
    }

6.測試:
1)版本衝突問題

    at cn.chen.ZkPayment8003.main(ZkPayment8003.java:20) [classes/:na]

    Caused by: org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /services/zk-provider-payment/35980513-f54c-4f89-922f-9a1a9400c868
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:103) ~[zookeeper-3.5.3-beta.jar:3.5.3-beta-8ce24f9e675cbefffb8f21a47e06b42864475a60]
        at org.apache.zookeeper.KeeperException.create(KeeperException.java:51) ~[zookeeper-3.5.3-beta.jar:3.5.3-beta-8ce24f9e675cbefffb8f21a47e06b42864475a60]

pom修改
a.排除掉自帶的zk

   <!-- zookeeper -->
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
       <!--排除zk3.5.3-->
       <exclusions>
           <exclusion>
               <groupId>org.apache.zookeeper</groupId>
               <artifactId>zookeeper</artifactId>
           </exclusion>
       </exclusions>
   </dependency>

b.引入3.4.14依賴

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

重啓:報錯。依然是衝突啦 (加完報錯,去掉又正常了,不知道原因)

 SLF4J: Class path contains multiple SLF4J bindings.
     <dependency>
        <groupId>org.apache.zookeeper</groupId>
         <artifactId>zookeeper</artifactId>
         <version>3.4.14</version>
         <!--排除這個slf4j-log4j12-->
         <exclusions>
             <exclusion>
                 <groupId>org.slf4j</groupId>
                 <artifactId>slf4j-log4j12</artifactId>
             </exclusion>
         </exclusions>
     </dependency>

curator與zookeeper版本不兼容

   java.lang.NoClassDefFoundError: org/apache/curator/connection/ConnectionHandlingPolicy

根據官方提供的文檔進行調整版本
Curator 2.x.x - compatible with both ZooKeeper 3.4.x and ZooKeeper 3.5.x
Curator 3.x.x - compatible only with ZooKeeper 3.5.x and includes support for new features such as dynamic reconfiguration, etc.

    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>2.12.0</version>
    </dependency>

2)查看

[zk: localhost:2181(CONNECTED) 7] ls /
[services, zookeeper]
[zk: localhost:2181(CONNECTED) 8] ls /services
[zk-provider-payment]
[zk: localhost:2181(CONNECTED) 12] ls /services/zk-provider-payment
[aa144b19-4f21-4c85-9642-b20a17e37322]
[zk: localhost:2181(CONNECTED) 13] get /services/zk-provider-payment/aa144b19-4f21-4c85-9642-b20a17e37322
{"name":"zk-provider-payment","id":"aa144b19-4f21-4c85-9642-b20a17e37322","address":"LWRYBF2EX9O1518","port":8003,"sslPort":null,"payload":{"@class":"org.springframework.cloud.zookeeper.discovery.ZookeeperInstance","id":"application-1","name":"zk-provider-payment","metadata":{}},"registrationTimeUTC":1590640957643,"serviceType":"DYNAMIC","uriSpec":{"parts":[{"value":"scheme","variable":true},{"value":"://","variable":false},{"value":"address","variable":true},{"value":":","variable":false},{"value":"port","variable":true}]}}
cZxid = 0xa
ctime = Thu Aug 08 06:46:39 EDT 2019
mZxid = 0xa
mtime = Thu Aug 08 06:46:39 EDT 2019
pZxid = 0xa
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x100067973630002
dataLength = 530
numChildren = 0

3)zk的服務節點是臨時節點。

消費者 80
1.新建module:zk-consumer-order80
2.pom引入依賴

     <dependencies>
        <!-- zookeeper -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        </dependency>

        <!--公共模塊-->
        <dependency>
            <groupId>cn.chen.demo</groupId>
            <artifactId>api-common</artifactId>
            <version>${project.version}</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- devtools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

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

3.yml

    server:
      port: 80

    spring:
      application:
        name: zk-consumer-order
      cloud:
        zookeeper:
          connect-string: 192.168.221.129:2181 #zk註冊中心地址
    zk:
      server:
        url: http://zk-provider-payment

4.config

    package cn.chen.config;

    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;

    /**
     * @version demo2020-1.0
     * @Title: ApplicationContextConfig
     * @Description:
     * @Company:
     * @package: cn.chen.config
     * @author: chenlf
     * @date: 2020/6/2
     */
    @Configuration
    public class ApplicationContextConfig {
        @LoadBalanced
        @Bean
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }

5.主啓動

    package cn.chen;

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

    /**
     * @version demo2020-1.0
     * @Title: ZkOrderApplication
     * @Description:
     * @Company:
     * @package: cn.chen
     * @author: chenlf
     * @date: 2020/6/2
     */
    @SpringBootApplication
    @EnableDiscoveryClient //服務發現
    public class ZkOrderApplication {
        public static void main(String[] args) {
            SpringApplication.run(ZkOrderApplication.class,args);
        }
    }

6.業務類

    package cn.chen.web;

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

    import javax.annotation.Resource;

    /**
     * @version demo2020-1.0
     * @Title: ZkOrderController
     * @Description:
     * @Company:
     * @package: cn.chen.web
     * @author: chenlf
     * @date: 2020/6/2
     */
    @RestController
    public class ZkOrderController {

        @Value("${zk.server.url}")
        private String zkUrl;

        @Autowired
        private RestTemplate restTemplate;

        @GetMapping("/consumer/payment/zk")
        public String payment (){
            String result = restTemplate.getForObject(zkUrl+"/payment/zk/test",String.class);
            return result;
        }

    }

springcloud學習系列目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章