目录
3、首先启动VMware上面的ZooKeeper服务注册中心,并且和Windows本机Ping通
我的上一篇文章:
初学SpringCloud:使用ZooKeeper作为服务注册中心,搭建单机版ZooKeeper服务注册中心 之 在CentOS下安装ZooKeeper
1、背景介绍
目前我本人使用的是ZooKeeper作为服务注册中心。已经在Linux的CentOS7版本的操作系统下搭建成功了。并且CentOS7操作系统我本人在安装的时候,进行了必要选项的勾选,能够进行图形化界面的操作,并且本身已经默认可以联网,跟我的本机已经连通了。采用的是默认的NAT模式。
2、本篇博客的目的和工作任务
因为服务注册中心已经搭建完毕了,我现在需要搭建一个服务提供者的模块。由于主要学习的是微服务的知识,因此我的业务逻辑就尽可能的简单的书写了。
在这里我需要强调的一点是:跟前面的Eureka做比较的话,其实它们两个都是服务注册中心,只不过Eureka作为服务注册中心的话,使用的直接就是一个模块,启动这个模块就可以啦,当然也是需要有必要的application的配置的。ZooKeeper的话,由于是使用JAVA语言编写的,所以还需要JDK的环境的支持。为了尽可能的接触一下Linux的知识吧,也是为了符合当前开发的主流,我将ZooKeeper部署在了Linux操作系统之上。
3、首先启动VMware上面的ZooKeeper服务注册中心,并且和Windows本机Ping通
ping命令的具体作用,我本人由于Linux学习的不是很精,因此呢不能对这个命令做很详细的讲解。但是它的作用就是验证两台计算机之间是否可以连通。
我在我的上面一篇博客中也提到过,我安装CentOS7的时候,到勾选安装那些内容的时候,我勾选的是最全的,因此我安装完CentOS7以后,这台虚拟机直接就是可以上网的。也就是可以直接在火狐浏览器上面打开百度主页的,因此不需要进行网络的配置。
这样的话,我只需要在命令行查看一下本机的IP,然后在虚拟机的终端 ping一下本机的IP就可以啦,一般情况下都是可以ping通的。
如上图所示,是我的本机的IP,获得了这个IP以后,直接在虚拟机的终端使用命令:
ping 192.168.11.1
4、开篇的POM文件
下面是我的POM文件的代码:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud2023</artifactId>
<groupId>com.lanse.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-payment8004</artifactId>
<dependencies>
<!-- 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>
<!--下面的这个依赖是引入了自己的那个模块新建成的jar包,就是把通用的entities提出来了-->
<dependency>
<groupId>com.lanse.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--加了下面这个依赖以后,application文件就可以正常识别了-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<!--下面这个是把zookeeper作为注册中心所必须的依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-zookeeper-discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
</dependencies>
</project>
前两个依赖的话,是配套的,这里我就不分析了,我本身也不是很明白。
第三个依赖,是我把每个微服务模块都会使用到的公共的一些实体类,抽出来组成了一个模块,然后这个模块使用install和package命令,打成了一个jar包,最后在依赖中引入进来了。再往下的依赖就是测试的,热部署的,插件的,mybatis的,JDBC的等我就不去详细的介绍了。我也不太明白其中包含了那些具体的功能。
最后还有两个依赖,是使用ZooKeeper作为服务注册中心必须的依赖。在这里我开了一个小小的玩笑,我先把一个jar包从依赖中剔除了出去,然后我在后面又把它给添加了进来。使用的版本比我安装的版本还要低一些。
5、开始编写服务提供端的代码
1、首先展示一下我的这个模块的代码结构:
首先就是application的配置文件。然后是一个主启动的类。最后是controller层的一个简单的方法。
2、application配置文件
代码如下:
server:
port: 8004
spring:
application:
name: cloud-provider-payment
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong
username: root
password: 123456
cloud:
zookeeper:
connect-string: 192.168.52.131:2181 #一个zookeeper机器的ip以及端口号
首先就是设置一下端口,端口号设置为 8004
然后设置一下 spring.application.name 这个是一定要设置的。这个就是在ZooKeeper服务注册中心注册的时候的注册名。无论任何的服务注册中心,肯定注册进去的时候,都是要有服务名的。
再往下就是数据库的有关的配置,这个在前面的Eureka作为服务注册中心的时候,已经说过了。不再多说了。
下面是一个重点, spring.cloud.zookeeper.connect-string 属性是我们要注册进的服务注册中心的地址和端口号。
需要把虚拟机启动并且把ZooKeeper服务注册中心启动。具体的启动方式可以看我的上一篇文章。然后我下面通过命令行的方式看一下这台虚拟机的IP:
注意我图上面使用红颜色标记的地方。我使用的是 ifconfig 命令。IP显示是 192.168.52.131,所以我们就要注册到这个IP上去;在配置文件上面还有一个端口号,使用的是2181的端口号;我还不能做到对这一点的详细的解释。这里使用的2181的端口号是ZooKeeper默认的端口号,是对Clinet端提供服务的端口号。 就像是我们的连接MySQL使用的url中使用的3306端口号一样。
3、我的conreoller类
下面是代码:
package com.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@RequestMapping("/payment/zk")
public String paymentzk(){
return "spring cloud with zookeeper:"+serverPort+"\t"+ UUID.randomUUID().toString();
}
}
这个类的代码是比较简单的。首先就是两个注解。其中的@Slf4j注解的功能在下面的代码中没有被使用到。 再往下就是一个 @Value注解,这个注解我之前讲过了,该注解的作用是将我们配置文件的属性读出来。也就是把application.yml文件中的一些配置属性的值读出来,放在类的私有属性中,使得我们可以在类方法中直接使用。
最好是使用 @Value("${server.port}")这种方法,直接写在类属性上面就行。
明显的,这样写了以后,serverPort字符串的值就是 8004
再往下就是一个@RequestMapping注解,然后是访问的路径。还有是一个方法,这个方法除了返回server.port属性以外,还返回一个随机生成的字符串 UUID.randomUUID().toString()
4、我的主方法
package com.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
//上面导入的包不能导入错误了,有两个包
@SpringBootApplication
@EnableDiscoveryClient
//上面这个注解就是用于向使用consul或者zookeeper作为注册中心时注册服务
public class PaymentMain8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8004.class,args);
}
}
上面的就是我的主方法的代码
首先@SpringBootApplication注解是肯定需要的
然后需要新加入一个注解 @EnableDiscoveryClient 我原先使用Eureka作为服务注册中心的时候,Client端使用的注解都是 @EnableEurekaClient 但是现在更换了服务注册中心以后,Client端(把需要注册进服务注册中心的微服务都统称为 Client 端)就需要更换注解了。
我也看了一些博客,大概这两个注解的区别就是:共同点都是 让注册中心能够发现,扫描到该服务。不同点是:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient
可以是其他注册中心。它们两个来自的位置的距离也是有一点远的。都只是org.springframework.cloud,后面的就不一样了。
下面的main方法,都是一直在使用的,这里就不多说啦。
5、正式的启动这个微服务
启动这个微服务以后,就是成功的注册进了ZooKeeper服务注册中心了。但是ZooKeeper跟Eureka有一个不一样的地方,就是Eureka天生就是带有可视化界面的,Eureka可以通过自带的可视化界面看到有哪些的服务注册进来了。但是ZooKeeper是不带有这个可视化界面的,我看了一些博客,也可以自己配置可视化界面zkui。这里我本人就不配置了。
在这里我就不在展示ZooKeeper服务注册中心的启动过程了,这个过程在我的上一篇博客也是有的。
如果不出意外的话,8004端口的这个微服务是可以顺利启动的。