转载

上手spring cloud(一)Eureka服务注册与发现

spring cloud面向开发人员,对分布式系统从编程模型上提供了强大的支持。可以说是分布式系统解决方案的全家桶,极大地降低了开发与构建分布式系统的门槛。

包括了诸如下列功能:

  • Eureka服务注册发现
  • 统一配置中心
  • Spring Cloud Stream异步调用
  • Zuul服务网关
  • Hystrix服务降级容错
  • 服务调用跟踪

Netflix是一家互联网流媒体播放商,美国视频巨头,最近买下《流浪地球》,并在190多个国家播出的就是它了。随着Netflix转型为一家云计算公司,也开始积极参与开源项目。Netflix OSS(Open Source)就是由Netflix公司开发的框架,解决上了规模之后的分布式系统可能出现的一些问题。spring cloud基于spring boot,为spring boot提供Netflix OSS的集成。

这段时间对spring cloud进行了学习总结,留下点什么,好让网友上手spring cloud时少躺坑。

我用的版本如下:

  • spring-boot 2.0.2.RELEASE
  • spring-cloud Finchley.RELEASE

spring boot不同版本之间在配置和依赖上会有差异,强烈建议创建工程后先把spring boot和spring cloud的版本依赖调整成与本篇一致,快速上手少躺坑。

上手完后,你可以尝试升到最新版本, 官方spring-cloud页 (进去后拉到最下面)提供了spring-cloud与spring-boot版本匹配表。升级完后建议重新测试一下相关功能。

Eureka服务注册与发现

Eureka Server服务注册中心

IntelliJ IDEA(我是2018.2.5的版本),创建工程eureka-server:

File -> New->Product... -> 选择Spring Initializr -> Project SDK用1.8 -> Next -> 输入Product Metadata -> Next -> 选择Cloud Discovery -> 选择Eureka Server

注意创建工程后调整spring boot和spring cloud的版本:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
...
<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>

由于选择了Eureka Server,创建成功后pom.xml里已经帮你引入了以下依赖:

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

我们给启动类加上注解@EnableEurekaServer:

package com.hicoview.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);
    }

}

配置application.yml(习惯yml风格的同学,把application.properties直接改过来):

eureka:
  client:
    # 默认eureka服务注册中心会将自身作为客户端来尝试注册,所以我们需要禁用它的客户端注册行为
    register-with-eureka: false
    # 默认30秒会更新客户端注册上来的服务清单,启动时就不获取了,不然启动会有报错,虽然不影响
    fetch-registry: false
  server:
    # 关闭注册中心自我保护(默认是true,生产环境不建议关闭,去掉该配置项或改成true)
    enable-self-preservation: false
spring:
  application:
    name: eureka
server:
  port: 8761

服务注册中心搞定,启动成功后访问 http://localhost :8761,可以看到注册中心页面:

上手spring cloud(一)Eureka服务注册与发现

Eureka Server高可用

只要启动多个注册中心进程即可,多个之间,两两注册到对方。比如,

8761端口启动一个eueka服务端,注册到8762:

eureka:
  client:
    service-url:
      # 提供其他注册中心的地址,注册中心将自身以客户端注册的方式注册到其他注册中心去
      defaultZone: http://localhost:8762/eureka/
    register-with-eureka: false
    fetch-registry: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: eureka
server:
  port: 8761

8762端口启动一个eueka服务端,注册到8761:

eureka:
  client:
    service-url:
      # 提供其他注册中心的地址,注册中心将自身以客户端注册的方式注册到其他注册中心去
      defaultZone: http://localhost:8761/eureka/
    register-with-eureka: false
    fetch-registry: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: eureka
server:
  port: 8762

访问 http://localhost:8761 ,可以看到8761这里有了8762的副本:

上手spring cloud(一)Eureka服务注册与发现

访问 http://localhost:8762 ,也是一样,你可以试试。

接下来我们用Eureka Client来验证下服务的注册。

Eureka Client

实际上充当Eureka Client角色应该是各种业务的微服务工程了,这里为了快速演示一下服务注册,临时先搞个无意义的client工程作为Eureka Client示范。

创建Eureka Client工程eureka-client:

File -> New->Product... -> 选择Spring Initializr -> Project SDK用1.8 -> Next -> 输入Product Metadata -> Next -> 选择Cloud Discovery -> 选择Eureka Discovery

注意每次创建工程后的第一件事,改spring-boot和spring-cloud的版本,不再赘述

由于选择了Eureka Discovery,创建成功后pom.xml里已经帮你引入了以下依赖:

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

修改pom.xml,还要加入web依赖,不然无法启动成功:

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

启动类加注解@EnableDiscoveryClient:

package com.hicoview.client;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ClientApplication {

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

}

配置application.yml:

eureka:
  client:
    service-url:
      # 注册中心地址,如果注册中心是高可用,那么这里后面可以添加多个地址,逗号分开
      defaultZone: http://localhost:8761/eureka/
      #defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
spring:
  application:
    name: client

启动成后,访问注册中心 http://localhost:8761 :

上手spring cloud(一)Eureka服务注册与发现

完成了Eureka服务注册示例,接下来我们简单模拟一个业务场景,示范微服务之间的服务调用。

原文  https://segmentfault.com/a/1190000018328721
正文到此结束
Loading...