文章目录
SpringCloud学习第二天之Eureka
一、Eureka基础知识
1、服务治理
2、服务注册与发现
3、Eureka组件
二、单机Eureka构建步骤
1、构建EurekaServer服务注册中心模块
同样4步走
①建立model:cloud-eureka-server7001
②改pom.xml文件,最重要注意此是server模块,引入server依赖即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
③改yml文件
server: #设置端口号
port: 7001
eureka:
instance:
hostname: localhost #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
④在主启动类上添加@EnableEurekaServer注解表名此为server端
2、构建EurekaClient端,将payment和order模块也就是服务提供者和消费者注册进Eureka服务中心
①改pom.xml文件,将eureka-client依赖加入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
②改yml文件
server:
port: 80
spring: #表示添加入注册中心,在注册中心等级的名称
application:
name: cloud-order-service
eureka:
client:
register-with-eureka: true #表识向注册中心注册自己
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka #要注册的注册中心地址
③在主启动类上添加@EnableEurekaClient注解
3、效果
三、Eureka集群搭建
1、eureka集群原理
2、集群搭建
①新建cloud-eureka-server7002和cloud-eureka-server7003模块
②在上述2个模块中pom.xml文件添加依赖
③修改电脑的host文件中的映射配置为
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com
④修改7001、7002和7003模块的yml文件中的端口号以及defaultZone,将他们相互注册,以7001的为例:
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名字
client:
register-with-eureka: false #表识不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
⑤为7002和7003添加启动类
⑥效果展示
⑦将payment和order模块注册进入eureake-server:修改application.yml文件中的defaultZone即可
server:
port: 80
spring:
application:
name: cloud-order-service
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka
⑧服务提供者集群构建
- 新建cloud-provider-payment8002模块,里面内容同8001模块大致类似,改变yml文件中的端口号为8002,其他配置不变。
- 修改8001和8002模块中的业务层代码,添加属性serverPort为当前模块的端口号,并将此属性返回给前端,告知消费者调用的是服务提供者集群中的哪一个服务端口。
public class PaymentServiceImpl implements PaymentService {
@Resource
private PaymentDao paymentDao;
@Value("${server.port}")
private String serverPort;//对应yml文件中的server.port
@Override
public CommonResult create(Payment payment) {
int result = paymentDao.create(payment);
log.info("******插入结果{}",result);
if (result > 0){
return new CommonResult(200,"插入数据成功,serverPort:"+serverPort,result);
}else
return new CommonResult(404,"插入数据失败",null);
}
@Override
public CommonResult getPaymentById(Long id) {
Payment payment = paymentDao.getPaymentById(id);
log.info("******查询结果{}",payment);
if(payment != null){
return new CommonResult(200,"查询成功,serverPort"+serverPort,payment);
}else
return new CommonResult(404,"没有对应记录"+id,null);
}
}
- 此时,修改服务消费者模块中的controller层代码,因为此时消费者调用的是提供者集群,因此最初定义的"PAYMENT_URL"常量需要修改为服务提供者集群的名称,对应于服务提供者yml文件中的sprng.application.name。
- 最后开启restTemplate的负载均衡功能,在80模块中的AplicationContextConfig类中的注入到Sprinf容器的RestTemplate上面添加注解@LoadBalanced,开启负载均衡。
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemple(){
return new RestTemplate();
}
}
- 此时负载均衡实现,消费者调用提供者集群时,就会随机调用其中一个。
三、actuator完善微服务信息
修改服务提供者8001和8002模块的yml文件
- 修改服务名称,不显示主机名称
- 显示每个端口的ip地址
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka
instance:
instance-id: payment8001
prefer-ip-address: true #访问路径可以显示ip地址
效果图:
四、服务发现Discovery
1、介绍
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息。也就是说8001注册进入了Eureka,就可以通过DiscoveryClient来获取整个微服务系统里面的所有信息
2、实现
- 修改服务提供者8001里面的controller
- 在8001的主启动类上加上@EnableDiscoveryClient注解
- 效果展示
五、Eureka的自我保护机制
1、总的概括
某时刻某一个微服务不可用了,Eureka不会立即清理,依旧会对该微服务的信息进行保存。
属于CAP分支里面的AP分支
2、为什么会产生Eureka自我保护机制
为了防止EurekaClient可以正常工作,但是与EurekaServer网络不通的情况下,Eureka不会立刻将EurekaClient服务剔除