服务注册与发现
Eureka
服务注册与发现
虽然服务拆分完成,但是没有一个比较合理的管理机制,如果单纯只是这样编写,在部署和维护起来,肯定是很麻烦的。 可以想象一下,如果某一天这些微服务的端口或是地址大规模地发生改变, 我们就不得不将服务之间的调用路径大规模的同步进行修改,这是多么可怕的事情。 我们需要削弱这种服务之间的强关联性,因此我们需要一个集中管理微服务的平台,这时就要借助我们这一部分的主角了。
Eureka能够自动注册并发现微服务,然后对服务的状态、信息进行集中管理,这样当我们需要获取其他服务的信息时,我们只需要向Eureka进行查询就可以了。 服务之间的强关联性就会被进一步削弱。
搭建一个Eureka服务器,只需要创建一个新的Maven项目即可, 然后我们需要在父工程中添加一下SpringCloud的依赖, 这里选用2021.0.1
版本(Spring Cloud 最新的版本命名方式变更了,现在是 YEAR.x 这种命名方式, 具体可以在官网查看:https://spring.io/projects/spring-cloud#learn)
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
1
2
3
4
5
6
7
2
3
4
5
6
7
接着我们为新创建的项目添加依赖:
xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
1
2
3
4
5
6
2
3
4
5
6
接着我们来创建主类
java
package com.example.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
修改一下配置文件:
yaml
server:
port: 8888
eureka:
# 开启之前需要修改一下客户端设置(虽然是服务端
client:
# 由于我们是作为服务端角色,所以不需要获取服务端,改为false,默认为true
fetch-registry: false
# 暂时不需要将自己也注册到Eureka
register-with-eureka: false
# 将eureka服务端指向自己
service-url:
defaultZone: http://localhost:8888/eureka
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
可以看到目前还没有任何的服务注册到Eureka,我们接着来配置一下其他微服务,首先还是需要导入Eureka依赖
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
1
2
3
4
2
3
4
创建application-eureka.yml
yaml
eureka:
client:
# 跟上面一样,需要指向Eureka服务端地址,这样才能进行注册
service-url:
defaultZone: http://localhost:8888/eureka
1
2
3
4
5
2
3
4
5
并且再主application.yml 启用它
yaml
spring:
application:
name: service-user
profiles:
active: eureka
1
2
3
4
5
2
3
4
5
当我们的服务启动之后,会每隔一段时间跟Eureka发送一次心跳包,这样Eureka就能够感知到我们的服务是否处于正常运行状态。
也就是说,我们之前如果需要对其他微服务进行远程调用,那么就必须要知道其他服务的地址:
java
User user = template.getForObject("http://localhost:8082/user/"+uid, User.class);
1
而现在有了Eureka之后,我们可以直接向其进行查询,得到对应的微服务地址,这里直接将服务名称替换即可:
java
User user = template.getForObject("http://service-user/user/"+uid, User.class);
1
接着我们手动将RestTemplate声明为一个Bean,然后添加@LoadBalanced
注解,这样Eureka就会对服务的调用进行自动发现,并提供负载均衡:
java
package com.example.borrow.configure;
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;
@Configuration
public class RestTemplateConfiguration {
@Bean
@LoadBalanced
public RestTemplate template(){
return new RestTemplate();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
注册中心高可用
虽然Eureka能够实现服务注册和发现,但是如果Eureka服务器崩溃了,岂不是所有需要用到服务发现的微服务就GG了?
为了避免,这种问题,我们也可以像上面那样,搭建Eureka集群,存在多个Eureka服务器,这样就算挂掉其中一个,其他的也还在正常运行,就不会使得服务注册与发现不可用。当然,要是物理黑客直接炸了整个机房,那还是算了吧。
我们来看看如何搭建Eureka集群,这里由于机器配置不高,就搭建两个Eureka服务器组成集群。
首先我们需要修改一下Eureka服务端的配置文件,这里我们创建两个配置文件,:
yaml
server:
port: 8801
spring:
application:
name: eurekaserver
eureka:
instance:
# 由于不支持多个localhost的Eureka服务器,但是又只有本地测试环境,所以就只能自定义主机名称了
# 主机名称改为eureka01
hostname: eureka01
client:
fetch-registry: false
# 去掉register-with-eureka选项,让Eureka服务器自己注册到其他Eureka服务器,这样才能相互启用
service-url:
# 注意这里填写其他Eureka服务器的地址,不用写自己的
defaultZone: http://127.0.0.1:8801/eureka
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yaml
server:
port: 8802
spring:
application:
name: eurekaserver
eureka:
instance:
hostname: eureka02
client:
fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:8801/eureka
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
可以看到下方replicas
中已经包含了另一个Eureka服务器的地址,并且是可用状态。
接着我们需要将我们的微服务配置也进行修改:
yaml
eureka:
client:
service-url:
# 将两个Eureka的地址都加入,这样就算有一个Eureka挂掉,也能完成注册
defaultZone: http://localhost:8801/eureka, http://localhost:8802/eureka
1
2
3
4
5
2
3
4
5