前言
Spring Cloud系列文章大多是有联系的,最好是从一开始看起
Spring Cloud系列: 点击查看Spring Cloud系列文章
Eureka 服务提供者
创建了注册中心之后,我们就可以创建提供服务的客户端工程了,然后将其注册到注册中心。如果不知道怎么创建注册中心的,请看Spring Cloud系列。
1、首先创建一个Spring Boot项目,添加以下依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、在启动类添加@EnableDiscoveryClient注解,在Hoxton版本已经可以不用加这个注解
3、在配置文件进行eureka客户端的配置
spring.application.name= eureka-client-service
server.port=8888
#指定服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:2002/eureka/
# 采用IP注册
eureka.instance.preferIpAddress=true
提示:6666端口号不可用,不要用
启动服务,我们可以看到控制台中有输出注册信息的日志:
2020-07-16 15:29:59.960 INFO 44920 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_EUREKA-CLIENT-SERVICE/eureka-client-service:192.168.137.1:8888- registration status: 204
启动该工程后,再次访问eureka页面,就可以看到我们的client客户端实例了。
至此,一个 Eureka 服务提供者就创建完成了,我们就可以在这个项目上创建接口,让消费者进行消费了
下面是我在服务提供者工程创建的hello接口
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
Eureka 服务消费者
当我们在一个客户端上提供了一个供其他的客户端使用的服务后,其他客户端如何消费呢。下面我们就来编写一个服务的消费者,来消费一个客户端提供的服务。
首先,创建一个spring boot项目,和服务提供方,添加相应的依赖和配置(将项目名和端口号改一下就行了),将项目注册到和服务提供方相同的注册中心上。
server.port=8890
spring.application.name= eureka-consumer-service
#指定服务注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:2002/eureka/```
注:最重要的就是将消费者工程和提供者工程都注册到同一个注册中心
两个客户端之间的通信访问,我们使用RestTemplate ,RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率。
//先配置一个RestTemplate来使用
@Configuration
public class RestConfiguration {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
调用服务,我们只需要通过RestTemplate 进行调用即可。调用服务,我们可以使用两种方式,一种是通过url直接调用,一种是通过eureka调用
下面我们就在消费者客户端调用上面服务提供方的hello接口
1、url直接调用
如下:
@Test
void contextLoads() {
String result = restTemplate.getForObject("http://localhost:8888/hello", String.class);
System.out.println(result);
}
在消费者客户端调用上面测试方法,成功输出hello
2、通过eureka调用服务
在同一个注册中心中调用服务,我们不需要知道服务提供者的url地址具体是多少,只需要知道服务提供者注册到eureka的名称即可。注册到eureka的名称一般就是spring.application.name
使用eureka调用服务,我们需要在RestTemplate的bean上添加 @LoadBalanced 注解(不添加不能通过服务名调用),这个注解会自动构造 LoadBalancerClient 接口的实现类并注册到 Spring 容器中,然后负载均衡地调用我们的服务实例
所以,我们要修改一下RestTemplate
//配置RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
//服务调用
@Test
void contextLoads() {
String result = restTemplate.getForObject("http://EUREKA-CLIENT-SERVICE/hello", String.class);
System.out.println(result);
}