Spring Cloud 系列(一) Eureka 解析

目录

一、Eureka简介

二、搭建单机版Eureka Server

三、创建Eureka Client

四、Eureka 安全

五、Eureka Server 集群


 

一、Eureka简介

Eureka源于Netflix,是一套基于REST(Representational State Transfer)的服务发现框架。Spring Cloud将它集成在其子项目spring-cloud-netflix中。

Eureka架构如下图

Eureka包含Eureka Server和Eureka Client两个组件

  • Eureka Server

       Eureka Server是注册中心,通过Register、Get、Renew等接口提供服务的注册、发现和心跳检测等服务。多个Eureka Server 可以组成集群,以达到高可用的目的。各个server启动后会自动同步注册表信息。

  • Eureka Client

        Eureka Client是一个java客户端。Eureka Client注册到Eureka Server后会定期(默认30秒)发送心跳,如果server端在多个心跳周期内未收到某client的心跳,就会将该client从服务注册表中删除。

         在上面的架构图中,Eureka Client有Application Service和Application Client两个角色,即Eureka Client可做为服务提供者或服务调用者。

  • Eureka架构图中的动作说明

        Register(服务注册):把自己的IP和端口注册给Eureka。
        Renew(服务续约):发送心跳包,默认每30秒发送一次。告诉Eureka自己还活着。
        Cancel(服务下线):当provider关闭时会向Eureka发送消息,把自己从服务列表中删除。防止consumer调用到不存在的服务。
        Get Registry(获取服务注册列表):获取其他服务列表。
        Replicate(集群中数据同步):eureka集群中的数据复制与同步。
        Make Remote Call(远程调用):完成服务的远程调用。

二、搭建单机版Eureka Server

  1.    新建spring boot项目,pom中加入spring-cloud-starter-netflix-eureka-server依赖,如下
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.2.6.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.springcloud.stu</groupId>
    	<artifactId>eureka-single-server</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>eureka-single-server</name>
    	<description>Demo project for Spring Boot</description>
    
    	<properties>
    		<java.version>1.8</java.version>
    		<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    	</properties>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    			<exclusions>
    				<exclusion>
    					<groupId>org.junit.vintage</groupId>
    					<artifactId>junit-vintage-engine</artifactId>
    				</exclusion>
    			</exclusions>
    		</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>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>
    
  2.  在Spring boot的启动类增加@EnableEurekaServer注解, 以开启注册服务功能。
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaSingleServerApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(EurekaSingleServerApplication.class, args);
    	}
    
    }

     

  3. 编写application.yml配置文件
    server:
      port: 7631
    spring:
      application:
        name: eureka-single-server
    eureka:
      instance:
        hostname: localhost
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
        server:
        #是否开启自我保护模式,默认情况下,注册中心每分钟去清理未续约的客户端,但开启自我保护模式时,如果有超过85%的客户端未续约,
        #则进入自我保护模式,不再清理未续约的客户端
        enable-self-preservation: true
      client:
        #是否将自己注册到注册中心,默认true
        register-with-eureka: true 
        #是否从注册中心获取注册表信息,自己本身就是注册中心,所以不需要
        fetch-registry: false
        #注册中心地址,多个用逗号分隔
        service-url:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

     

  4. 启动Spring boot的启动类,在浏览器输入http://localhost:7631/,打开Eureka的服务面板,单机版的Eureka Server即搭建成功。                    
  5.  
  6. f

三、创建Eureka Client

    这里会创建两个Client, 一个作为服务提供者,另一个作为服务消费者。

  1. 创建一个Eureka Client,作为服务提供者,步骤如下                                                                                                               1.1  新建一个Spring Cloud项目, pom中加入如下依赖
            <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-web</artifactId>
    		</dependency>
    		<dependency>

     2.2  修改Spring Boot启动类,增加EnableEurekaClient(推荐使用EnableDiscoveryClient,是更高层次的抽象,不限定是Eureka的客户端)注解。

    @SpringBootApplication
    @EnableEurekaClient
    public class EurekaClientProducerApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(EurekaClientProducerApplication.class, args);
    	}
    
    }

     2.3  修改application.yml

    server:
      port: 8631
    spring:
      application:
        name: eureka-client-producer
    eureka:
      instance:
        hostname: localhost
        appname: producer #显示在Eureka控制面板中,如果不配置,将会显示 spring.application.name的值
      client:
        service-url:
          #注册中心地址
          defaultZone: http://localhost:7631/eureka/

     2.4  创建一个Web Controller,提供接口服务

    @RestController
    @RequestMapping(path="producer")
    public class ProducerController {
    
    	@GetMapping("/get")
    	public String get(String name) {
    		return return "Hello "+name;;
    	}
    	
    }

     2.5  启动项目,查看是否成功注册到Eureka Server

  2. 创建第二个Eureka Client,作为服务消费者,步骤同创建第一个Eureka Client。其application.yml如下                                   
    server:
      port: 8632
    spring:
      application:
        name: eureka-client-consumer
    eureka:
      instance:
        hostname: localhost
        appname: consumer #显示在Eureka控制面板中,如果不配置,将会显示 spring.application.name的值
      client:
        service-url:
          #注册中心地址
          defaultZone: http://localhost:7631/eureka/

    Spring Boot启动类中增加RestTemplate Bean, 用来调用Producer的接口

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

    Controller中使用RestTemplate调用Producer服务, 调用地址使用producer的spring.application.name的值

    @RestController
    @RequestMapping("/consumer")
    public class ConsumerController {
    	@Autowired
    	RestTemplate restTemplate;
    
    	@GetMapping("/get")
    	public String get(String name) {
    		return "producer return:"+restTemplate.getForObject("http://eureka-client-producer/producer/get?name="+name, String.class);
    	}
    	
    	
    }

    启动项目,注册成功后访问 http://localhost:8632/consumer/get?name=Tom , 返回“producer return:Hello Tom”。至此Eureka Client演示完毕。

四、Eureka 安全

      在Eureka Server的pom中加入spring-boot-starter-security依赖,启动服务后访问Eureka的仪表盘会发现提示输入帐号密码。默认帐号为user, 密码在服务启动时会随机生成。 可以修改application.yml来设置用户名和密码

这时,Eureka Client都无法注册到Eureka Server, 所以还需要做如下配置

首先,增加security 配置

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * @Description: 高版本的丢弃了
     * security:
     *   basic:
     *     enabled: true 配置,应该使用以下方式开启
     * @Param: [http]
     * @Return: void
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Configure HttpSecurity as needed (e.g. enable http basic).
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
        http.csrf().disable();
        //注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,
        // 如果是form方式,不能使用url格式登录
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

其次,eureka.client.service-url.defaultZone 的配置中增加用户名和密码信息,格式如下

五、Eureka Server 集群

       如果要达到高可用的目的,建议搭建不少于3个Eureka Server节点。

  1. 为了模拟集群,首先修改系统的hosts文件
    127.0.0.1 peer1
    127.0.0.1 peer2 
    127.0.0.1 peer3
  2. 修改Eureka Server 的application.yml文件,配置三个profiles: peer1, peer2, peer3

    eureka:
      instance:
        appname: eureka-server-ha
        prefer-ip-address: false
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
    spring:
      application:
        name: eureka-server-ha
    #  profiles:
    #    active: 
    #     - peer3
    #启动命令  nohup java -jar xxx.jar --spring.profiles.active=peer1
    ---
    server:
      port: 8761
    spring:
      profiles:
      - peer1
    eureka:
      instance:
        hostname: peer1
      client:
        service-url:
          defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/ 
    ---
    server:
      port: 8762
    spring:
      profiles:
      - peer2
    eureka:
      instance:
        hostname: peer2
      client:
        service-url:
          defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/ 
    ---
    server:
      port: 8763
    spring:
      profiles:
      - peer3
    eureka:
      instance:
        hostname: peer3
      client:
        service-url:
          defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/ 
    

     

  3. 使用maven install 生成jar包

  4. 在windows命令行窗口分别执行 java -jar xxxx.jar --spring.profiles.active=peer1,来启动peer1。同样的方式启动peer2和peer3。访问 http://peer1:8761, http://peer2:8762 和 http://peer3:8763

  5. Eureka Client 注册到集群的方式,只需将三个节点的地址都写到service-url。

      client:
        service-url:
           defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/

     

 

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值