Spring Cloud Eureka注册中心

Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责实现微服务架构中的服务治理功能。

Spring Cloud Eureka 是一个基于 REST 的服务,并且提供了基于Java 的客户端组件,能够非常方便地将服务注册到 Spring Cloud Eureka 中进行统一管理。

服务治理是微服务架构中必不可少的一部分,阿里开源的 Dubbo 框架就是针对服务治理的。

服务治理必须要有一个注册中心,除了用 Eureka 作为注册中心外,我们还可以使用 Consul、Etcd、Zookeeper 等来作为服务的注册中心。

用过 Dubbo 的朋友应该清楚,Dubbo 中也有几种注册中心,比如基于 Zookeeper、基于 Redis 等。

注册中心无非就是管理所有服务的信息和状态。

在分布式系统领域有个著名的 CAP 定理,即 C 为数据一致性;A 为服务可用性;P 为服务对网络分区故障的容错性。这三个特性在任何分布式系统中都不能同时满足,最多同时满足两个。

为什么 Eureka 比 Zookeeper 更适合作为注册中心呢?主要是因为 Eureka 是基于 AP 原则构建的,而 ZooKeeper 是基于 CP 原则构建的。

Zookeeper 有一个 Leader,而且在这个 Leader 无法使用的时候通过 Paxos(ZAB)算法选举出一个新的 Leader。这个 Leader 的任务就是保证写数据的时候只向这个 Leader 写入,Leader 会同步信息到其他节点。通过这个操作就可以保证数据的一致性。

搭建Eureka服务注册中心

首先创建一个Maven项目,取名eureka-server,在pom.xml文件中配置Eureka的依赖,代码如下所示。

1.  <!-- Spring Boot -->
2.  <parent>
3.  <groupId>org.springframework.boot</groupId>
4.  <artifactId>spring-boot-starter-parent</artifactId>
5.  <version>2.0.6.RELEASE</version>
6.  <relativePath />
7.  </parent>

9.  <dependencies>
10.  <!-- eureka -->
11.  <dependency>
12.  <groupId>org.springframework.cloud</groupId>
13.  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
14.  </dependency>
15.  </dependencies>

17.  <!-- Spring Cloud -->
18.  <dependencyManagement>
19.  <dependencies>
20.  <dependency>
21.  <groupId>org.springframework.cloud</groupId>
22.  <artifactId>spring-cloud-dependencies</artifactId>
23.  <version>Finchley.SR2</version>
24.  <type>pom</type>
25.  <scope>import</scope>
26.  </dependency>
27.  </dependencies>
28.  </dependencyManagement>

创建启动类EurekaServerApplication,代码示例如下。

1.  @EnableEurekaServer
2.  @SpringBootApplication
3.  public class EurekaServerApplication {
4.      public static void main(String[] args) {
5.          SpringApplication.run(EurekaServerApplication.class, args);
6.      }
7.  }

@EnableEurekaServer注解,表示开启 Eureka Server。
接下来在创建 application.properties 属性文件,增加下面的配置:

spring.application.name=eureka-server
server.port=55555
# 由于该应用为注册中心, 所以设置为false, 代表不向注册中心注册自己
eureka.client.register-with-eureka=false
# 由于注册中心的职责就是维护服务实例, 它并不需要去检索服务, 所以也设置为 false
eureka.client.fetch-registry=false

通过 http://localhost:55555/ 访问Eureka 提供的控制台。

编写Eureka服务提供者

1.创建项目注册到 Eureka

注册中心已经创建并启动好了,接下来我们实现将一个服务提供者 eureka-client-message-server 注册到 Eureka 中,并提供一个接口给其他服务调用。
首先创建一个 Maven 项目,然后在pom.xml文件中增加相关依赖,代码如下所示。

1.  <!-- Spring Boot -->
2.  <parent>
3.  <groupId>org.springframework.boot</groupId>
4.  <artifactId>spring-boot-starter-parent</artifactId>
5.  <version>2.0.6.RELEASE</version>
6.  <relativePath />
7.  </parent>

9.  <dependencies>
10.  <dependency>
11.  <groupId>org.springframework.boot</groupId>
12.  <artifactId>spring-boot-starter-web</artifactId>
13.  </dependency>

15.  <!-- eureka -->
16.  <dependency>
17.  <groupId>org.springframework.cloud</groupId>
18.  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
19.  </dependency>
20.  </dependencies>

22.  <!-- Spring Cloud -->
23.  <dependencyManagement>
24.  <dependencies>
25.  <dependency>
26.  <groupId>org.springframework.cloud</groupId>
27.  <artifactId>spring-cloud-dependencies</artifactId>
28.  <version>Finchley.SR2</version>
29.  <type>pom</type>
30.  <scope>import</scope>
31.  </dependency>
32.  </dependencies>
33.  </dependencyManagement>

创建启动类MessageApplication,代码示例如下。

1.  @SpringBootApplication
2.  @EnableDiscoveryClient
3.  public class MessageApplication {
4.      public static void main(String[] args) {
5.           SpringApplication.run(MessageApplication.class, args);
6.      }
7.  }

注解换成 @EnableDiscoveryClient,表示当前服务是一个 Eureka 的客户端。
接下来在创建 application.properties 属性文件,增加下面的配置:

spring.application.name= eureka-client-message-service
server.port=10001
eureka.client.serviceUrl.defaultZone=http://localhost:55555/eureka/
# 采用IP注册
eureka.instance.preferIpAddress=true
# 定义实例ID格式
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}

eureka.client.serviceUrl.defaultZone 的地址就是我们之前启动的 Eureka 服务的地址,在启动的时候需要将自身的信息注册到 Eureka 中去。

2.编写提供接口

创建一个 Controller,提供一个接口给其他服务查询,代码如下所示。

@RestController
public class MessageController {
    @GetMapping("/message/hello")
    public String hello() {
        return “hello”;
    }
}

访问 http://localhost:10001/message/hello

编写Eureka服务消费者

创建服务消费者,消费我们刚刚编写的 message/hello 接口,同样需要先创建一个 Maven 项目 eureka-client-article-service,然后添加依赖,依赖和服务提供者的一样。
创建启动类 ArticleApp,启动代码与前面所讲也是一样的。唯一不同的就是 application.properties 文件中的配置信息:

spring.application.name=eureka-client-article-service
server.port=10002

首先 RestTemplate 的配置,添加一个 @LoadBalanced 注解,这个注解会自动构造 LoadBalancerClient 接口的实现类并注册到 Spring 容器中,代码如下所示。

@Configuration
public class BeanConfiguration {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

我们使用属性文件中的 spring.application.name 服务名称调用接口,相关代码如下所示。

@GetMapping("/article/callHello")
public String callHello() {
    return restTemplate.getForObject("http://eureka-client-message-service/message/hello", String.class);
}

Eureka注册中心开启密码认证

Eureka 自带了一个 Web 的管理页面,方便我们查询注册到上面的实例信息,但是有一个问题:如果在实际使用中,注册中心地址有公网 IP 的话,必然能直接访问到,这样是不安全的。所以我们需要对 Eureka 进行改造,加上权限认证来保证安全性。

改造我们的 eureka-server,通过集成 Spring-Security 来进行安全认证。

在 pom.xml 中添加 Spring-Security 的依赖包,代码如下所示。

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

然后在 application.properties 中加上认证的配置信息:

spring.security.user.name=spap #用户名
spring.security.user.password=spap20201106 #密码

增加 Security 配置类:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 关闭csrf
        http.csrf().disable();
        // 支持httpBasic
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

在 Eureka 开启认证后,客户端注册的配置也要加上认证的用户名和密码信息:

eureka.client.serviceUrl.defaultZone=http://spap:spap20201106@localhost:55555/eureka/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容