微服务---服务注册中心Eureka
文章目录
- 一.简介
- 二.搭建单机版Eureka架构
- 1.搭建EurekaServer(7001端口)
- 2.搭建EurekaClient—-生产者(8001端口)
- 3.搭建EurekaClient—-消费者(80端口)
- 4.EurekaClient—-消费者使用`RestTemplate`消费EurekaClient—-生产者提供的服务
- 二.搭建集群版(高可用)Eureka架构
- 0.我们只有一台电脑,集群需要至少两台电脑,为了进行模拟,修改host文件
- 1.搭建EurekaServer集群(7001端口,7002端口)
- 2.搭建EurekaClient(生产者)集群(8081端口,8082端口)
- 3.有了两个生产者,消费者究竟选择哪个生产者进行消费?
- 三.常用的配置
一.简介
Spring Cloud Eureka 是由Netfilx公司开发的基于Rest服务的服务治理套件。
Eureka Server(服务注册中心):提供服务注册和发现功能.
ServiceProvider(EurekaClient):提供服务,并将服务注册到服务注册中心.
ServiceConsumer(EurekaClient):拉取服务列表并消费服务.
二.搭建单机版Eureka架构
我们采用一个EurekaServer(服务注册中心),两个EurekaClient(一个服务生产者和一个服务消费者)
1.搭建EurekaServer(7001端口)
导入依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
编写
application.yml
文件server:
port: 7001 #服务启动的端口eureka:
instance:hostname: localhost #eureka服务端的实例名
client:
#false代表不向服务注册中心注册自己
register-with-eureka: false
#false代表只需维护服务注册中心注册的服务实例而不用去检索服务
fetch-registry: false
service-url:
defaultZone: http://localhost:7001/eureka/
启动类上加上
@EnableEurekaServer
注解.@SpringBootApplication
@EnableEurekaServer
public class EurekaServerMain7001 {public static void main(String[] args) {
SpringApplication.run(EurekaServerMain7001.class, args);
}
}
访问localhost:7001
,可以看到下面画面,代表启动成功.
2.搭建EurekaClient—生产者(8001端口)
导入依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
修改
application.yml文件
server:
port: 8081spring:
application:
name: cloud-payment-service
eureka:
instance:
hostname: localhost
client:向服务注册中心注册
register-with-eureka: true
向服务注册中心拉取注册的服务实例(单机版provider无所谓,集群必须设置为true才能配合ribbon使用负载均衡)
fetch-registry: true
服务注册中心Server向外提供的服务接口URL
service-url:
#这里是服务注册中心(EurekaServer)的URL
defaultZone: http://localhost:7001/eureka/
在主启动类上加上
@EnableEurekaClient
注解@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8081 {
public static void main(String[] args) {SpringApplication.run(PaymentMain8081.class, args);
}
}具体的业务代码…
启动后再访问localhost:7071
就可以看见多了一个Eureka实例
3.搭建EurekaClient—消费者(80端口)
除具体业务代码不同,其他与EurekaClient—生产者相同.
启动后实例变为两个
4.EurekaClient—消费者使用RestTemplate
消费EurekaClient—生产者提供的服务
创建RestTemplate
/* 相当于applicationContext.xml */
@Configuration
public class ApplicationContextConfig {
@Bean
public RestTemplate getRestTemplate() {return new RestTemplate();
}
}在Controller中进入注入,并调用RestTemplate具体的逻辑方法
@Autowired
private RestTemplate restTemplate;
通过RestTemplate我们就可以进行GET
,POST
等方法的调用了.
注意:使用RestTemplate进行调用时,要传入提供服务的URL
1.使用具体的地址URL=http://127.0.0.1:8081
2.使用服务名(⭐️推荐使用)URL=http://CLOUD-PAYMENT-SERVICE
举例:
@GetMapping("/get/{id}")
public CommonResult getPayment(@PathVariable("id") Long id) {
return restTemplate.getForObject("http://CLOUD-PAYMENT-SERVICE" + "/payment/get/" + id, CommonResult.class);
}
二.搭建集群版(高可用)Eureka架构
我们采用两个EurekaServer(服务注册中心)相互注册,三个EurekaClient(一个消费者,两个生产者构成集群)
搭建集群版是基于单机版的,很多重复步骤,我就主要讲不同点
0.我们只有一台电脑,集群需要至少两台电脑,为了进行模拟,修改host文件
- 进入C:\Windows\System32\drivers\etc\
- 默认修改不了host文件,需要修改权限:属性–>安全–>高级–>添加–>选择主体–>输入电脑用户名–>检查名称–>.基本权限全部√
- 属性–>只读的√去掉
- 修改host文件,增加server1,server2.
1.搭建EurekaServer集群(7001端口,7002端口)
修改
application.yml
,将service-url
设置为另外一个EurekaServer,其它相同.server:
port: 7001eureka:
instance:
hostname: server1 #eureka服务端的实例名
client:false代表不向服务注册中心注册自己
register-with-eureka: false
false代表只需维护服务注册中心注册的服务实例而不用去检索服务
fetch-registry: false
service-url:#设置与Eureka交互的地址(查询和注册服务)
#集群模式指向其它Eureka Server
defaultZone: http://server2:7002/eureka/
#单机模式指向自己
#defaultZone: http://server1:7001/eureka/
好了之后访问server1:7001
,可以看见,同时也可以访问server2:7002
2.搭建EurekaClient(生产者)集群(8081端口,8082端口)
之前我们的
service-url
,只有写了一个服务注册中心的url,现在我们有了两个服务注册中心,需要写上两个服务注册中心的url,用,
进行分割。server:
port: 8081spring:
application:
name: cloud-payment-serviceeureka:
instance:
hostname: localhostclient:
向服务注册中心注册
register-with-eureka: true
向服务注册中心拉取注册的服务实例(单机版provider无所谓,集群必须设置为true才能配合ribbon使用负载均衡)
fetch-registry: true
服务注册中心Server向外提供的服务接口URL
service-url:
defaultZone: http://server1:7001/eureka/,http://server2:7002/eureka/
3.有了两个生产者,消费者究竟选择哪个生产者进行消费?
还记得之前说过我们通过RestTemplate
进行远程方法调用来消费服务吗?,如果有多个生产者,我们只需要在RestTemplate
的bean上加上@loadBalance
注解行了!
/** * 相当于applicationContext.xml */
@Configuration
public class ApplicationContextConfig {
@Bean
//@LoadBalanced注解提供了RestTemplate负载均衡的能力
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
效果例子:第一次访问是8080端口,刷新后是8081端口,不断轮询
三.常用的配置
自己设置显示的实例名,以及鼠标放实例名上显示为ip.
eureka:
instance:
hostname: localhost
instance-id: order80
prefer-ip-address: true #显示出ip
- 关闭 Eureka自我保护机制.
在我们打开eureka的web管理界面是经常看到红色提示.
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
这是因为Eureka Client通过心跳机制每隔30s
告知Eureka Server一次我还存活,如果90s
内没告知,就认为Eureka Server不可用了,但是某时刻某个微服务不可用了,Eureka不会立即清理,依旧会对该微服务的信息进行保存.
这样就保证了Eureka Client是好的,由于网络故障导致不可用,Eureka Client仍然存在服务注册中心,等待Client的恢复.
Eureka的自我保护默认是开启的,不过我们可以通过设置enable-self-preservation=false
将自我保护机制关闭
eureka:
server:
#关闭自我保护机制,保证不可用服务被及时剔除
enable-self-preservation: false
eviction-interval-timer-in-ms: 90000
客户端中也可以修改心跳机制的默认时间
eureka:
instance:
hostname: localhost
instance-id: order80
prefer-ip-address: true #显示出ip
#客户端向服务注册中心发送心跳间隔(默认30秒)
lease-renewal-interval-in-seconds: 30
#最后一次心跳后,剔除服务等待时间(默认90秒)
lease-expiration-duration-in-seconds: 90
具体相关代码//github.com/wantao666/SpringCloud2020
还没有评论,来说两句吧...