我们已经搭建好了 eureka注册中心,(也可以理解为中介平台)
现在我们将我们之前的 服务提供方 和 服务调用方 ,注册到 Eureka注册中心。(可以理解为下载 中介平台)
而注册服务,就是在服务里添加Eureka的客户端依赖,客户端代码会自动将服务注册到EurekaServer中。
我们先来将 服务提供方 注册到 Eureka。
主要分为三步:
-
在pom.xml中,添加springcloud的相关依赖。
-
在application.yml中,添加springcloud的相关依赖。
-
在引导类上添加注解,把服务注入到eureka注册中心。
下面来具体操作下,改造一下yuanxion-service-provider工程
(可以参照eureka依赖配置)
先在properties里加一个版本号:
然后加一个版本号统一管理:
引入Eureka客户端依赖:
完整pom.xml文件:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.yuanxion.service.service</groupId>
<artifactId>yuanxion-service-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>yuanxion-service-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
然后注册信息到Eureka,
到引导类中,启用客户端。
这样就好了,我们重启一下yuanxion-service-provider。
然后刷新或者重新访问一下 http://localhost:10086
可以看到,服务提供方 service-provider 注册成功了,在Eureka注册中心上可以看到了。
下面,我们再将 服务调用方 service-consume 注册到 Eureka。
也还是同样的三步:
-
在pom.xml中,添加springcloud的相关依赖。
-
在application.yml中,添加springcloud的相关依赖。
-
在引导类上添加注解,把服务注入到eureka注册中心。
改造 yuanxion-service-consumer 工程,可以参照上面的 改造 yuanxion-service-provider工程 的过程 。
步骤一样,就不赘述了。
给出 关键的地方的代码或截图。
第一步,yuanxion-service-consumer 的 pom.xml 文件:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.yuanxion.service</groupId>
<artifactId>yuanxion-service-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>yuanxion-service-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
第二步:
第三步:
这样就好了。
重启 yuanxion-service-consumer
然后刷新或者重新访问一下 http://localhost:10086
可以看到,服务提供方 service-provider 注册成功了,在Eureka注册中心上也可以看到了。
这样,我们就成功改造这两个微服务,注册到eureka注册中心了。
我们再来解决之前的一个问题:在 服务调用方 consumer中,我们把url地址硬编码到了代码中,不方便后期维护。
下面来 改造一下 服务调用方 ,解决地址硬编码的问题,使其通过微服务的方式来调用。
先大概了解一下eureka的工作原理:
服务提供方 将信息注册 到 Eureka注册中心
Eureka注册中心 会周期检查 服务提供方 是否还在 (renew)
当 服务调用方 向 Eureka注册中心 注册,并提供 需求后, 会从 Eureka注册中心 获取 所有符合需求 的 服务提供方列表
服务调用方 从中选择一个 服务提供方, 就可以使用 服务提供方的服务了。
我们可以在Controller中获取 服务提供方的列表:
然后 可以获取 服务列表, 从中选择一个 服务, 动态获取 服务地址和端口号 ,动态拼接出 地址。
@Controller
@RequestMapping("consumer/user") //加个前缀,区分于之前的user
public class UserController {
@Autowired //注入RestTemplate,为了远程调用服务提供方的接口
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient; // 包含了获取的所有的服务提供方的列表信息
@GetMapping
@ResponseBody
public User queryUserById(@RequestParam("id")Long id){
//获取服务列表
List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
//获取一个服务实例
ServiceInstance instance = instances.get(0);
return this.restTemplate.getForObject("http://" + instance.getHost() + ":" + instance.getPort() + "/user/" + id,User.class); //获取并反序列化后返回
}
}
我们再来 重启一下 yuanxion-service-consumer
然后重新访问一下 http://localhost/consumer/user?id=1,看看还能不能调用 服务提供方 的方法:
成功了!
我们的 改造微服务到Eureka注册中心就完成了。
(最后那个解决 地址硬编码 问题的方法,这里只是了解一下。因为这个方法还不够好,我们后面会用更好的方式来解决。)