之前一直使用Eureka作为注册中心,后来发现有的公司使用Consul,有的公司使用Zookeeper了,这是什么原因呢?百度后发现Eurkea 2.x不再维护,Eurkea 1.x仍可用于生产环境。不想基于不确定的明天,那么今天就改成别的注册中心吧,比如Zookeeper,以下简称zk。
现在在Windows上安装zk已经相当简单了,在官网下载压缩包,zip、tar都可以,解压缩之后,进入bin目录,执行zkServer.cmd,默认在2181端口开启了服务,很简单吧。
我们可以使用一个叫做zktools的可视化工具,来观察zk的节点:
下面来说一说springCloud,我们假设有两个服务serviceA、serviceB,它们都注册到zk。serviceB通过声明式接口FeignClient调用ServiceA已经写好的接口。
serviceA的pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
serviceA的配置:
server:
port: 8081
spring:
application:
name: serverA
cloud:
zookeeper:
connect-string: 127.0.0.1:2181
serviceA的启动类及其接口:
@Configuration
@EnableDiscoveryClient
@RestController
@SpringBootApplication
public class ServerAApplication {
public static void main(String[] args) {
SpringApplication.run(ServerAApplication.class, args);
}
@RequestMapping("/hello")
public String hello() {
return "Hello World";
}
}
serviceB的pom,配置文件,启动类大同小异,不过是服务名称换了,q启动类加入注解@EnableDiscoveryClient,另外pom新增:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign </artifactId>
</dependency>
serviceA、serviceB启动之后,zk的节点:
其实就是服务把自身的ip,端口,各种状态信息放入zk,其余的服务可以从zk获取要调用服务的列表,该列表包含ip,端口等信息,所以就可以互相调用了。
serviceB的feignClient:
@FeignClient(name="serverA")// 要调用的接口所属服务
public interface ServerAClient {
@RequestMapping("/hello")// 要调用接口url
String helloTest();// 方法名可以随便起 返回类型跟服务接口返回类型保持一致
}
使用feignClient:
@Autowiredprivate ServerAClient serverAClient;
@RequestMapping("/hello2")public String hello2() {return serverAClient.helloTest()+"测试";}
解释一下:访问a服务的ip:port/hello2 -->进入hello2方法-->serverAClient是ServerAClient的实现类,内部使用Ribbon从zk获取服务A的可用列表,然后选出一个可用服务,restTemplate发送请求到某个服务的ip:port,完成请求,返回响应,最后hello2方法返回。
只要类路径下有spring-cloud-starter-zookeeper-discovery,那么该服务既把自身当做服务注册到zk,同时它也是一个客户端,可以去发现别的服务。可以spring.cloud.zookeeper.discovery.enabled = false来关闭发现其它服务的行为。
当然zk不仅可以当做服务注册中心,也可以当做config服务类来使用。
本文暂时没有评论,来添加一个吧(●'◡'●)