目录
1.什么是Eureka ❤️❤️❤️
2. 组件❤️❤️❤️
3.单机Eureka配置❤️❤️❤️
4.服务8001服务入住eureka ❤️❤️❤️
5.消费端80入住到eureka ❤️❤️❤️
6.集群Eureka配置 ❤️❤️❤️
7.将Client发布到eureka集群上 ❤️❤️❤️
8.服务端8002集群搭建 ❤️❤️❤️
9.负载均衡 ❤️❤️❤️
10.actuator信息完善❤️❤️❤️
11.服务发现 ❤️❤️❤️
Eureka是一个开源的服务发现框架,由Netflix公司开发。它可以用于在分布式系统中,自动注册、发现和管理服务实例。Eureka通过使用RESTful API,使得服务实例可以通过名称进行查找,从而实现了服务之间的通信。Eureka还具有高可用性和故障恢复机制,可以有效地处理服务注册和发现的问题。
Eureka包含两个组件:Eureka Server和Eureka Client
- Eureka Server:提供服务注册服务各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。
- EurekaClient:通过注册中心进行访问是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳, EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
在父工程下创建子模块
注:jdk版本,maven版本
用到通用模块,导入依赖
引入eureka服务端依赖
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-test
test
org.projectlombok
lombok
true
org.example
cloud-api-commons
${project.version}
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
@EnableEurekaServer:可以将一个普通的 Spring Boot 应用转变为 Eureka 服务器,用于注册和发现其他微服务实例
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class);
}
}
1.修改端口号
2.添加eureka配置
3.注意yml格式
server:
port: 7001
eureka:
instance:
#eureka服务端的实例名称
hostname: localhost
client:
#false:表示不向注册中心注册自己
register-with-eureka: false
#false:表示自己就是注册中心,维护服务,不需要检测
fetch-registry: false
#设置与Eureka server交互的地址查询服务和注册服务都需要依赖这个地址。
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}
访问配置的地址+ip成功看到eureka界面
添加eureka客户端依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
添加入住eureka的配置信息
eureka:
client:
#表示将自己注册到EurekaServer
register-with-eureka: true
#是否从EurekaServer抓取已有的配置,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
#注入eureka地址
service-url:
defaultZone: http://localhost:7001
@EnableEurekaClient:将当前应用作为Eureka客户端注册到Eureka服务器。
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class);
}
}
启动8001服务端口,刷新浏览器页面,就会发现服务8001注册到eureka中
服务端,消费端,在这里都是相对于eureka而言
因此消费端80相对于eureka也是Client端
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
1.配置服务名称
2.配置入住到eureka的信息
spring:
application:
name: cloud-consumer-order
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka
添加@EnableEurekaClient:入住到eureka
@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class);
}
}
启动80服务端口,刷新浏览器页面,就会发现服务80注册到eureka中
雷同7001模块,在创建模块7002,7003
注意:jdk版本,maven版本
7001,7002,7003都是服务端,所以依赖相同
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-test
test
org.projectlombok
lombok
true
org.example
cloud-api-commons
${project.version}
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
只有一台机器,创建三个域名指向同一个ip模拟三台机器
地址:C:\Windows\System32\drivers\etc下面的hosts
以7001为例
1.添加hostname(hosts里配置的)
2.service-url 在另外两个eureka注入自己
注意:中间用逗号隔开,不要用空格
server:
port: 7001
eureka:
instance:
#eureka服务端的实例名称
hostname: eureka7001.com
client:
#false:表示不向注册中心注册自己
register-with-eureka: false
#false:表示自己就是注册中心,维护服务,不需要检测
fetch-registry: false
#设置与Eureka server交互的地址查询服务和注册服务都需要依赖这个地址。
service-url:
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
注意添加@EnableEureServer
@SpringBootApplication
@EnableEurekaServer//代表eureka服务端注册中心
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class);
}
}
分别启动三台eureka,并浏览器访问
只需要在yml文件中,将其eureka的注册地址更改为多个即可
注:地址之间用逗号隔开,之间不能有空格
eureka:
client:
#表示将自己注册到EurekaServer
register-with-eureka: true
#是否从EurekaServer抓取已有的配置,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
#注入eureka地址
service-url:
defaultZone: http://erureka7001:7001/eureka,http://erureka7002:7002/eureka,http://erureka7003:7003/eureka
server:
port: 80
spring:
application:
name: cloud-consumer-order
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://erureka7001:7001/eureka,http://erureka7002:7002/eureka,http://erureka7003:7003/eureka
在controller层使用@value标识端口号
@RestController
@RequestMapping("/payment")
@Slf4j
public class PaymentController {
@Autowired
private PaymentService paymentService;
@Value("${server.port}")
private String serverPort;
}
启动eureka集群后,先启动8001(服务端相对于80)在启动80,刷新浏览器
可以看到:每台机器上都部署有其他eureka的信息,并且都有8001和80的注册信息
创建和8001模块一样的模块,注意(如果拷贝的话很肯定识别错误)
添加和8001一样的pom依赖
修改端口号8002,其余和8001一模一样
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8002 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8002.class);
}
}
启动eureka集群后分别启动8001,8002;刷新浏览器可以发现一个应用程序有两个服务
启动eureka集群后,在启动8001,8002服务端,最后启动80消费端。
但是80只能访问8001,因为我们在使用RestTemplate时,固定了访问地址
public static final String PAYMENT_URL = "http://localhost:8001";
public static final String PAYMENT_URL = "http://COULD-PAYMENT-SERIVCE";
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced//赋予了RestTemplate负载均衡的能力
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
如何修改IP地址 ,并显示IP端口
添加instance-id修改服务名称,prefer-ip-address:true:访问路径可显示ip
eureka:
client:
#表示将自己注册到EurekaServer
register-with-eureka: true
#是否从EurekaServer抓取已有的配置,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
#注入eureka地址
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
#修改服务名称
instance:
instance-id: paymnet8002
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
装配DiscoveryClient对象
注意:import org.springframework.cloud.client.discovery.DiscoveryClient;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/discovery")
public Object discovery() {
List services = discoveryClient.getServices();
for (String element : services) {
log.info("列表中有:" + element);
}
List instances = discoveryClient.getInstances("COULD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + "\t" + instance.getUri());
}
return this.discoveryClient;
}
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class);
}
}