假设你已经理解何为微服务架构。
先来设想一个场景:
一个微服务的业务逻辑,需要的基础数据,来源于另一个微服务。
我们可以这样做。
RestTemplate restTemplate = new RestTemplate();
restTemplate.getForObject("http://192.168.0.100?/user/id=" + id, User.class);
这是一个代码片段,能理解大概意思就行了,不需要自己去跑一遍。
首先有一个微服务发布在局域网IP地址为192.168.0.100这台机器的80端口,他提供User信息服务,可以通过id获取到用户信息。
OK,这样子编码似乎没什么问题,我想要的数据我已经获取到了。开始大量编码,从192.168.0.100这个IP地址获取用户信息应用在当前微服务的各个方面。
可是,如果获取用户信息这个微服务地址变了,怎么办?我们得修改所有的代码。
这个工作量不是只有一点点,而且,如果有很多个微服务呢?也全部修改吗?
Eureka解决了这个问题。我们把Eureka理解为一个注册中心。
在分布式架构里面,有多个微服务,每个微服务有对应它自己的请求地址。然后微服务把这个地址提交到Eureka,由Eureka来进行记录。
比如:User微服务的地址是192.168.0.100,我只要问Eureka,我该从哪里获取到User信息啊?Eureka就告诉我:192.168.0.100。
当User微服务的地址换成192.168.0.101的时候,由它告诉Eureka。然后Eureka再记录下来,这时我再问它,我该从哪里获取到User信息啊?Eureka告诉我:192.168.0.101。
服务发现就是这么回事。
Spring Cloud提供了多种服务发现组件的支持,比如Eureka,Zookeeper,Consul,这里介绍一下Eureka。
接下来谈谈怎么实现。
老生常谈:引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
接下来在修改启动类,添加@EnableEurekaServer注解。声明这是一个Eureka Server。
接着修改配置文件,我的配置文件习惯用yaml文件,如果你是properties,也无妨,编写格式不一样而已。
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka/
讲解一下。
第一个在properties的写法是server.port=8761。
指定端口号。
接下来的配置是关于Eureka的:
register-with-eureka定义了是否将自己注册到Eureka Server,默认为true,由于当前应用就是Eureka Server(即上文提到的注册中心)。所以设置为false。
fetch-registry定义是否从其他Eureka Server获取注册信息。默认为true。这个适用于Eureka集群部署的情况,实现高可用Eureka,这个我以后会继续发布博文来介绍,现在是单节点Eureka,所以把它设置为false。
以上两个设置,不设置也行,项目能跑起来,但是控制台会有报错。
接下来是设置service-url.defaultZone。
这个就是注册中心的地址。就是当前配置的Eureka Server的地址。
微服务将自己注册到Eureka、微服务查询其他微服务都是通过这个地址。
一个单节点Eureka Server就搭建好了。
启动这个微服务。访问http://localhost:8761/ 就能看到如下界面
上面有一些信息:当前时间、当前应用等。
由于目前只是启动了一个Eureka Server,还没有服务注册上来,所有Application是空的。
后面将继续介绍如何将微服务注册到Eureka Server。