前言
Eureka是一个注册中心,在以前的记录中,两个服务之间的调用需要使用硬编码的方式,即把ip和端口号等地址写死在程序中,使用Eureka可解决此问题,但不知能解决这个问题,还有其他的作用。
Eureka的作用
1.消费者该如何获取服务提供者的信息?
服务提供者启动时,向Eureka注册自己的信息
eureka保存这些信息
消费者根据服务名称向eureka拉取提供者信息
2.如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中选择一个
3.消费者如何感知服务器供着健康状态?
服务提供者会每隔30s向Eureka注册中心发送心跳请求,报告健康状态
eureka会更新记录服务器列表信息,心跳不正常的进行剔除
消费者就可以拉取到最新的信息
搭建Eureka服务
创建项目
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>3.1.1</version>
</dependency>
编写main函数
package ptiv.sinoam.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
编写配置文件(application.yml)
server:
port: 9003
spring:
application:
name: eureka-server
eureka:
client:
service-url: # eureka徐娅注册自己的信息
defaultZone: http://127.0.0.1:9003/eureka
启动eureka
发现报错Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.
这是因为该项目在父级pom中引入了jdbc,springboot启动时会自动装配,这个时候发现没有配置数据库所以会报错,在main方法中添加以下代码即可:
@EnableEurekaServer
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
即可启动成功,打开页面可以看到
服务注册
将demo-user注册到eureka
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.1.1</version>
</dependency>
编写配置文件
添加以下代码即可
eureka:
client:
service-url: # eureka徐娅注册自己的信息
defaultZone: http://127.0.0.1:9003/eureka
使用同样方式将demo-order注册到eureka中,启动后会看到注册的服务列表
如果同一个服务启动多个会怎样
复制一个user服务,然后通过-Dserver.port=9004修改端口
启动后发现user多了服务
Eureka服务发现
在消费者中修改写死的url,用服务名代替ip和port
//调用demo-user里面的请求
// String url = "http://localhost:9001/demouser/user/test";
//用服务名进行替换
String url = "http://demo-user/demouser/user/test";
然后添加负载均衡
找到restTemplate添加注解
/**
* 创建RestTemplate并注入Spring容器
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
重启order项目,调用接口后
不断刷新后,可以在两个user项目的日志中发现都有走,说明实现了负载均衡
结束
1.搭建Eureka
引入server依赖
添加@EnableEurekaServer注解
在配置文件中配置eureka地址
2.服务注册
引入client注解
在配置文件中配置eureka地址
3.服务发现
引入client注解
在配置文件中配置eureka地址
在restTemplate添加@LoadBalanced实现负载均衡