一、关于

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

本文代码仓库地址:https://github.com/lazyrabb1t/rabb-springcloud-demo

二、创建Eureka注册中心

1、创建server模块
2、pom.xml引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3、application.yml配置
server:
  port: 10002
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4、启动类添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}
5、集群配置

添加两个配置文件,defaultZone中填对方的地址,分别使用这两个文件启动,它们就会互相注册,生成一个拥有双节点的注册中心集群。

注册文件1:

server:
  port: 10003
eureka:
  instance:
    hostname: eureka-server-10003
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://127.0.0.1:10004/eureka/

注册文件2:

server:
  port: 10004
eureka:
  instance:
    hostname: eureka-server-10004
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://127.0.0.1:10003/eureka/
6、添加用户认证
1)pom.xml添加security依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
2)application.yml配置用户名密码
spring:
  security:
    user:
      name: lazyrabbit
      password: 123456
3)添加WebSecurityConfig配置类,关闭csrf校验
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 默认情况下添加SpringSecurity依赖的应用每个请求都需要添加CSRF token才能访问,
        // Eureka客户端注册时并不会添加,所以需要配置/eureka/**路径不需要CSRF token。
        http.csrf().ignoringAntMatchers("/eureka/**");
        // 注册时关闭用户认证
//        http.authorizeRequests()
//                .antMatchers("/eureka/**").permitAll();
        super.configure(http);
    }
}
4)最后修改所有项目中的defaultZone的地址
eureka:
  client:
    service-url:
      defaultZone: http://lazyrabbit:123456@127.0.0.1:10003/eureka
7、常用配置项

官方文档:https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/appendix.html

eureka:
  client: #eureka客户端配置
    register-with-eureka: true #是否将自己注册到eureka服务端上去
    fetch-registry: true #是否获取eureka服务端上注册的服务列表
    service-url:
      defaultZone: http://localhost:8001/eureka/ # 指定注册中心地址
    enabled: true # 启用eureka客户端
    registry-fetch-interval-seconds: 30 #定义去eureka服务端获取服务列表的时间间隔
  instance: #eureka客户端实例配置
    lease-renewal-interval-in-seconds: 30 #定义服务多久去注册中心续约
    lease-expiration-duration-in-seconds: 90 #定义服务多久不去续约认为服务失效
    metadata-map:
      zone: jiangsu #所在区域
    hostname: localhost #服务主机名称
    prefer-ip-address: false #是否优先使用ip来作为主机名
  server: #eureka服务端配置
    enable-self-preservation: false #关闭eureka服务端的保护机制

三、创建Eureka服务提供者客户端

1、创建提供者模块,pom.xml添加eureka-client依赖
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
2、application.yml配置
server:
  port: 10000
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10002/eureka
  instance:
    instance-id: provider-10000
spring:
  application:
    name: rabb-eureka-provider
3、添加服务
@SpringBootApplication
@RestController
@Slf4j
public class EurekaProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaProviderApplication.class, args);
    }

    @GetMapping
    public String hello() {
        log.info("provider has bean invoked!");
        return "Hello SpringCloud!";
    }
}

四、创建Eureka消费者客户端

1、创建消费者模块,pom.xml添加依赖,同提供者模块
2、application.yml配置
server:
  port: 10001
spring:
  application:
    name: rabb-eureka-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10002/eureka
  instance:
    instance-id: consumer-10001
3、调用服务
@SpringBootApplication
@RestController
@EnableEurekaClient
public class EurekaConsumerApplication {

    @Autowired
    RestTemplate restTemplate;

    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @GetMapping
    public String hello() {
//        return "INVOKE PROVIDER HELLO METHOD:" + restTemplate.getForEntity("http://localhost:10000", String.class).getBody();
        return "INVOKE PROVIDER HELLO METHOD:" + restTemplate.getForEntity("http://RABB-EUREKA-PROVIDER", String.class).getBody();
    }

}

参考

https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/

https://juejin.cn/post/6844903940312530957