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则显示需要登录

服务提供者向做了安全认证的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,然后性能变低了,但代码可读性变强了,编写也更加简单了。

 

 

posted @ 2022-05-18 10:39  RFAA  阅读(166)  评论(0编辑  收藏  举报