SpringCloud服务注册与发现
微服务已经是当今最热门的互联网技术之一,而SpringCloud无疑是Java后端微服务技术的首选,通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。本篇文章主要讲一下Eureka。
1. Eureka是什么
Eureka是SpringCloud微服务的核心,包含了服务端组件和客户端组件。
Eureka Server也被称作是服务注册中心,用于提供服务的注册与发现,集群中的各个节点启动后自动注册到Eureka服务端,服务注册表中将会存储所有可用服务节点的信息,节点信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端内置了一个负载均衡器,使用轮询(round-robin)负载算法发送请求。
服务启动后,Eureka Client每隔30秒向服务端发送心跳包,用于更新服务信息,如果服务端在90秒内没有收到某个服务的心跳包,将会从服务注册表中把这个服务节点移除。
服务消费者第一次访问其他服务的接口时,会从注册中心中获取服务提供者的地址列表,缓存在本机JVM中并定时更新,然后通过RPC的方式直接与服务提供者进行交互。
2. 搭建Eureka服务注册中心
2.1 新建一个maven项目命名为eureka_server
pom文件如下:
<?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>com.owner</groupId>
<artifactId>euraka-server</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<dependencies>
<!--添加Eureka服务器端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
springboot不同版本对应的springcloud版本不一样,本篇文章使用了springboot-2.0.6.RELEASE,对应的springcloud版本是Finchley.RELEASE,不同版本artifactId略有不同。
2.2 新建服务启动类,添加注解@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args){
SpringApplication.run(EurekaApplication.class, args);
}
}
2.3 新建application.yml文件
server:
port: 8010
# 设置服务名
spring:
application:
name: eureka-server
# 设置注册中心地址
eureka:
instance:
hostname: 127.0.0.1
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
完成以上操作后即可启动eureka_server服务,访问 http://localhost:8010/ 可以看到Eureka的页面
3. 创建Eureka服务提供者
3.1 新建一个maven项目命名为eureka_member
pom文件如下:
<?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">
<groupId>com.owner</groupId>
<artifactId>euraka-member</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加Eureka客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
</project>
3.2 新建服务启动类,添加注解@EnableEurekaClient
@EnableEurekaClient
@SpringBootApplication
public class MemberApplication {
public static void main(String[] args){
SpringApplication.run(MemberApplication.class, args);
}
}
3.3 新建application.yml文件
server:
port: 8001
# 设置服务名
spring:
application:
name: eureka-member
# 设置注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:8010/eureka/
register-with-eureka: true
fetch-registry: true
3.4 新建服务接口类
@RestController
public class MemberController {
@RequestMapping("getMember")
public String getMember() {
return "我是会员服务!!!";
}
}
完成以上操作后即可启动eureka_member服务
4. 创建Eureka服务消费者
4.1 新建一个maven项目命名为eureka_order
pom文件如下:
<?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">
<groupId>com.owner</groupId>
<artifactId>euraka-order</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--添加Eureka客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
</project>
4.2 新建服务启动类,添加注解@EnableEurekaClient
@EnableEurekaClient
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args){
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
4.3 新建application.yml文件
server:
port: 8002
# 设置服务名
spring:
application:
name: eureka-order
# 设置注册中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:8010/eureka/
register-with-eureka: true
fetch-registry: true
4.4 新建服务接口类
@RestController
public class OrderController implements IOrderService {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("getOrder")
public String getOrder() {
String url = "http://eureka-member/getMember";
String result = restTemplate.getForObject(url, String.class);
return "订单服务调用会员服务>>>" + result;
}
}
注意接口中使用了RestTemplate,需要在启动类OrderApplication中添加以下代码:
//接口中使用RestTemplate,必须将RestTemplate的单利注册到Spring容器中
@Bean
// LoadBalanced注解开启负载均衡,否则LoadBalanced无法识别应用名称eureka-member
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
完成以上操作后即可启动eureka_order服务, 再次访问 http://localhost:8010/ 可以看到Eureka的页面
至此服务注册与发现的基本功能已搭建完成,可以访问http://127.0.0.1:8002/getOrder 测试服务消费者请求服务提供者