【Spring Cloud】分布式必学springcloud(二)——注册中心Eureka

一、前言

      在上一篇博客中,小编简单的向大家介绍了springcloud的一些概念,大家可能对那些还是不太的了解,不过没有问题,盲人摸象嘛,慢慢的摸,你会了解的越来越多的。所以不用担心。在下面的博客,小编依次介绍,依次实现。

      在这篇博客中,小编介绍一下注册中心——Eureka。

二、注册中心Eureka

      想必做过Dubbo的老铁们一定使用过Zookeeper吧。这里的zookeeper就起到了一个注册中心的作用。Dubbo架构中分成了提供者和消费者,提供者需要把自己的服务注册到注册中心,消费者订阅注册中心,注册中心有提供者后,会通知消费者。ZK起到了一个服务协调的作用。

      在springcloud中,自己提供了一个注册中心——Eureka。

      Eureka是一个基于REST(Representational State Transfer)的服务,主要用于AWS cloud, 提供服务定位(locating services)、负载均衡(load balancing)、故障转移(failover of middle-tier servers)。我们把它叫做Eureka Server. Eureka也提供了基于Java的客户端组件,Eureka Client,内置的负载均衡器可以实现基本的round-robin负载均衡能力。在Netflix,一个基于Eureka的更复杂的负载均衡器针对多种因素(如流量、资源利用率、错误状态等)提供加权负载均衡,以实现高可用(superior resiliency).

三、服务注册中心

3.1 建立Maven项目

      小编使用springboot的快速生产项目的网站 http://start.spring.io/,来生产项目:

这里写图片描述

      导入idea:

这里写图片描述

3.2 导入Eureka依赖和springcloud依赖

      在maven的pom文件中,添加Eureka依赖:spring-cloud-starter-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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
<groupId>com.forezp</groupId>
    <artifactId>eurekaserver</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
<name>eurekaserver</name>
    <description>Demo project for Spring Boot</description>
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Edgware.SR2</spring-cloud.version>
    </properties>
<dependencies>
        <!--eureka server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
<!-- spring boot test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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>
<repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

      添加完成的时候,如果要建立父子pom,需要把${spring-cloud.version}提取出来。这样子pom中跟springcloud相关的就不用设置版本号了。

3.3 代码编写

      springboot有一个application的启动类,我们这里就修改这个启动类:添加@EnableEurekaServer。通过这个注解,启动一个服务注册中心提供给其他应用进行对话。

package com.wl.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;


@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

3.4 修改配置文件

      在默认情况下,注册中心会将自己作为客户端来尝试注册自己,所以我们需要禁用它的客户端注册行为。需要在application.properties文件或application.yml中添加配置。

      注意:生成的maven项目默认是application.properties,没有application.yml,对比一下,官方很多的demo中使用的是application.yml,另外application.yml天然的形成了树结构。代码写的也少。

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

      代码说明:

  • eureka.client.registerWithEureka:false ,由于应用为注册中心, 来表明自己是一个eureka server. 不会把自己注册到自己上。

  • eureka.client.fetchRegistry:由于注册中心的职责是维护服务实例,不需要去检索服务,所以也设置为false

3.5 运行

      运行后,输入http://localhost:8761/,打开注册中心监控页面:

这里写图片描述

3.6 Eureka配置用户名密码登录

      pom文件中添加:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

      修改配置文件:

server:
  port: 8761

security:
  basic:
    enabled: true
  user:
    name: admin
    password: admin

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${security.user.name}:${security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/

      再次登录的时候,会出现输入账户和密码的弹窗:

这里写图片描述

四、服务提供者

      建立如下的结构:

这里写图片描述

      当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。
      创建过程同server类似,创建完pom.xml如下:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wl</groupId>
    <artifactId>client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>client</name>
    <description>Demo project for Spring Boot</description>


    <parent>
        <groupId>com.wl</groupId>
        <artifactId>scf</artifactId>
        <version>0.0.1-SNAPSHOT</version>
</parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

    </dependencies>

</project>

      创建controller:

package com.wl.client.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by Ares on 2018/4/11.
 */
@RestController
public class User {

    @GetMapping("/user/findById")
    public String findById(@RequestParam("id")String id){
        return "这个是springcloud的客户端"+id;
    }


}

      配置启动类:

package com.wl.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class ClientApplication {

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

      类中@EnableEurekaClient或@EnableDiscoveryClient注解,激活EurekaDiscoveryClient实现,自动化配置,创建DiscoveryClient接口针对Eureka客户端的EnableDiscoveryClient实例。

      修改配置文件:

server:
  port: 9001
eureka:
  client:
    serviceUrl:
      defaultZone: http://${security.user.name}:${security.user.password}@localhost:8761/eureka/
spring:
  application:
    name: client1
security:
  basic:
    enabled: true
  user:
    name: admin
    password: admin

      在配置文件中,使用spring.application.name配置服务名,如命名为client1;通过eureka.serviceUrl.defaultZone指定服务注册中心的地址,这里小编指定的是之前建立的注册中心地址。

      依次启动注册中心http://localhost:8761/和提供者

这里写图片描述

      我们可以通过访问 http://localhost:9001//user/findById?id=1来访问提供者:

这里写图片描述

五、小结

      Eureka服务注册发现,容错管理、失效剔除、自我保护、安全验证。功能真是很强大,使用也非常好用,多多用吧。

发布了353 篇原创文章 · 获赞 367 · 访问量 143万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章