SpringCloud-Eureka服务注册与发现
官网手册:https://www.springcloud.cc/spring-cloud-dalston.html
Eureka介绍
在微服务架构中往往会有一个注册中心,每个微服务都会向注册中心去注册自己的地址及端口信息,注册中心维护着服务名称与服务实例的对应关系。每个微服务都会定时从注册中心获取服务列表,同时汇报自己的运行情况,这样当有的服务需要调用其他服务时,就可以从自己获取到的服务列表中获取实例地址进行调用。并且系统的维护人员也可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
Eureka就是服务注册中心,也可以是一个集群,对外暴露自己的地址;
服务提供者(ApplicationService):启动后向Eureka注册自己的信息(地址,提供的服务)。
消费者(ApplicationClient):向Eureka订阅服务,Eureka会把对应的服务的所有提供者的地址列表发送给消费者,并且定期更新。
心跳(renew):提供者定期通过Http方式向Eureka刷新自己的状态。
Eureka还有一个自我保护机制,这个可以直接参考以下该CSDN:https://blog.csdn.net/weixin_54707282/article/details/123362629
Eureka和Zookeeper的区别
在一个分布式系统中,需要满足CPA理论,包括一致性(Consistency)+ 分区容错性(Partition tolerance)+ 可用性(Availability),但是,这三个要素不可能同时满足C(一致性)、P(分区容错性)和A(可用性),最多只能同时实现两点,不可能三者兼顾。
- 一致性(Consistency):由于分布式环境存在多个节点,这些节点上的数据在同一时间所存储的数据必须是一致的,这就是一致性协议。
- 分区容错性(Partition tolerance):可用性很好理解,任何时刻需要保证服务的可用和稳定。
- 可用性(Availability):所谓分区容错是指某个时刻出现网络或者硬件不可用,甚至宕机,其它的机器还能保证正常可用。
说直白点,Eureka基于AP, 注重服务的可用性,即使所有机器都挂了,也能拿到本地缓存的数据,保证高可用。Zookeeper基于CP, 注重数据的一致性,若主机挂掉则zk集群整体不对外提供服务了,需要选一个新leader的出来(120s作用)才能继续对外提供服务,不保证高可用。
搭建EurekaServer注册中心
首先需要先创建一个SpringCloud项目,可参考SpringCloud项目创建,然后再创建一个Eureka的Module进行以下配置
Maven
<!--eureka-server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
application.yml
Eureka更多配置项详解可参考:https://blog.csdn.net/qq_45040919/article/details/120498288
server:
port: 7001
spring:
application:
name: Eureka-Server1
#Eureka配置
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #表示是否向Eureka注册中心注册自己
fetch-registry: false #如果为false,则表示自己为注册中心
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
SpringBoot启动类
@SpringBootApplication @EnableEurekaServer //启动Eureka Server public class SpringcloudEureka7001Application { public static void main(String[] args) { SpringApplication.run(SpringcloudEureka7001Application.class, args); } }
启动项目后访问
服务提供者(也可以说是生产者)
先来看看服务提供者的一个目录,这里不上具体的代码,说白了,服务提供者其实也就是提供一个服务暴露出来给别人调用,在springcloud中则需要注册该服务到服务中心
服务提供者想要向Eureka注册自己的信息也很简单,只需要三步
Maven
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
application.yml
加上Eureka的配置
server: port: 8081 mybatis: type-aliases-package: com.chen.springcloudapi.pojo mapper-locations: classpath:mappers/*.xml spring: application: name: springcloud-provider-user datasource: username: root password: 123456 url: jdbc:mysql://192.168.111.129:3306/test?characterEncoding=UTF-8&useSSL=false driver-class-name: com.mysql.jdbc.Driver #Eureka的配置 eureka: client: service-url: defaultZone: http://localhost:7001/eureka/ #Eureka集群只需要用逗号分隔即可 instance: instance-id: springclou-provider-user8081 #修改在Eureka上的默认描述信息
SpringBoot启动类
@SpringBootApplication @EnableEurekaClient public class SpringcloudProviederUser8081Application { public static void main(String[] args) { SpringApplication.run(SpringcloudProviederUser8081Application.class, args); } }
服务提供者启动后再次去访问Eureka
搭建Eureka注册中心集群
由于我们使用的是同一台设备,所以配置一下hosts文件进行域名映射,hosts文件所在路径:C:\Windows\System32\drivers\etc
再创建一个Eureka
二者唯一的区别就是application.yml文件
springcloud-eureka-7001
server:
port: 7001
spring:
application:
name: Eureka-Server1
#Eureka配置
eureka:
instance:
hostname: Eureka-Server1
client:
register-with-eureka: false #表示是否向Eureka注册中心注册自己
fetch-registry: false #如果为false,则表示自己为注册中心
service-url:
#单机的话配置自己即可,集群的话则不需要配置自己,全部配置其他Eureka节点,逗号分隔
defaultZone: http://Eureka-Server2:7002/eureka/
springcloud-eureka-7002
server:
port: 7002
spring:
application:
name: Eureka-Server2
#Eureka配置
eureka:
instance:
hostname: Eureka-Server2
client:
register-with-eureka: false #表示是否向Eureka注册中心注册自己
fetch-registry: false #如果为false,则表示自己为注册中心
service-url:
#单机的话配置自己即可,集群的话则不需要配置自己,全部配置其他Eureka节点,逗号分隔
defaultZone: http://Eureka-Server1:7001/eureka/
启动Eureka集群后再次访问eureka页面,可以看到,他们其实是互相注册的
服务提供者向Eureka集群注册自己
只需要修改applicaiton中的Eureka配置
#Eureka的配置
eureka:
client:
service-url:
defaultZone: http://Eureka-Server1:7001/eureka/,http://Eureka-Server2:7002/eureka/ #Eureka集群只需要用逗号分隔即可
instance:
instance-id: springclou-provider-user8081 #修改在Eureka上的默认描述信息
Eureka配置安全认证
#基于上方的Eureka集群搭建进行配置
需要先给Eureka-Server添加如下依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
application.yml文件配置security登录用户密码
spring:
application:
name: Eureka-Server1
security: #配置SpringSecurity登录用户名和密码
user:
name: macro
password: 123456
新增一个SpringSecurity的配置类
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().ignoringAntMatchers("/eureka/**"); super.configure(http); } }
applicaiton.yml中需要修改注册中心地址格式为 http://${username}:${password}@${hostname}:${port}/eureka/
#Eureka配置
eureka:
instance:
hostname: Eureka-Server1
client:
register-with-eureka: false #表示是否向Eureka注册中心注册自己
fetch-registry: false #如果为false,则表示自己为注册中心
service-url:
#单机的话配置自己即可,集群的话则不需要配置自己,全部配置其他Eureka节点,逗号分隔
defaultZone: http://macro:123456@Eureka-Server2:7002/eureka/
服务提供者向做了安全认证的Eureka注册自己
同样的,applicaiton.yml中修改注册中心地址格式为 http://${username}:${password}@${hostname}:${port}/eureka/即可
#Eureka的配置
eureka:
client:
service-url:
defaultZone: http://macro:123456@Eureka-Server1:7001/eureka/,http://macro:123456@Eureka-Server2:7002/eureka/ #Eureka集群只需要用逗号分隔即可
instance:
instance-id: springclou-provider-user8081 #修改在Eureka上的默认描述信息
至于消费者(ApplicationClient)在此应该如何去使用呢,可参考SpringCloud-Ribbon负载均衡工具 或 SpringCloud-Feign
这二者都是调用微服务访问的方法,不同的地方就是Ribbon是通过微服务(Eureka上的服务注册名)名字进行调用,Feign是通过接口和注解来进行的调用。但是其实Feign也集成了Ribbon来实现负载均衡。从代码上看,感觉Feign就是直接代替了RestTemplate,然后性能变低了,但代码可读性变强了,编写也更加简单了。