在演示spring cloud之前得要知道我们为什么需要微服务框架。

先讲讲我的经历,以前我们做项目时所有功能都写在一起,只是做了分层(模型,数据,业务),所有业务逻辑都写在业务层,刚开始还好,等时间长了,代码量大,各业务代码之间有交集维护起来超级麻烦,每次改动都担心会不会对其他模块造成影响,只改动一个模块也要停系统发一次包,我们以前包含了订单,支付,会员,预定,库存,物流等模块,时间越长心里越慌,出问题的频次也越高,就这样恶性循环。后来我们尝试着把会员剥离了出去,发现效果还不错,后来慢慢的都一个个剥离了出去,一个模块一个服务,各自维护,每次发包只要发对应的模块,不影响其他模块,大大的降低了出问题的频次,维护起来也比较轻松。其实我们老早就摸到了微服务的门槛,只是那时候没有理论和概念作为支撑,只知道这样可行。

我相信大家或多或少有和我类似的经历,上面已经说到了一个模块一个服务,模块服务化其实就是微服务所提倡的,微服务的主旨是将原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行。我之前只有不超过10个服务,而且是单服务应用,没有分布式,没有负载均衡,只是点对点通信。想想看如果是成千上百个服务,我们该怎么办,该如何管理这些服务?这个时候就该我们 spring cloud微服务框架出马了。spring cloud微服务框架的目的就是方便我们协调服务,管理服务,能更快更好的扩展服务。它里面有服务统一的注册中心,有客户端负载均衡,有服务容错保护,有网关,有服务追踪等等。讲了这么多,大家应该对微服务和微服务框架有了一个大体的认识,如果还不清楚的话,看一下我微服务栏里面的那个系列文章。

我们正式开始演示Spring Cloud Eureka,它包含了服务注册中心,服务注册,服务发现。我们把服务注册中心归类为Eureka的服务端,服务注册,服务发现归类为Eureka的客户端。

服务注册中心就是存放服务实例的地方(会保存服务实例的名称,IP地址,端口号,等信息),服务注册就是把服务提交到服务注册中心,服务发现就是从服务注册中心找到对应的服务。

大体的流程是这样的:第一步你得现有一个服务注册中心,第二部把你的服务注册到服务注册中心上去,第三步你的客户端通过服务发现机制找到服务。

下面我们就来创建一个服务注册中心

我们现在创建一个服务注册中心,创建一个 名为 eureka-server 的 spring boot 项目

POM如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5 <parent>
6 <groupId>org.springframework.boot</groupId>
7 <artifactId>spring-boot-starter-parent</artifactId>
8 <version>2.0.4.RELEASE</version>
9 <relativePath/>
10 </parent>
11 <groupId>com.jp</groupId>
12 <artifactId>eureka-server</artifactId>
13 <version>0.0.1-SNAPSHOT</version>
14 <name>eureka-server</name>
15 <description>Demo project for eureka-server</description>
16
17
18 <properties>
19 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
20 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
21 <java.version>1.8</java.version>
22 <spring-cloud.version>Finchley.SR1</spring-cloud.version>
23 </properties>
24
25 <dependencies>
26 <dependency>
27 <groupId>org.springframework.cloud</groupId>
28 <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
29 </dependency>
30
31 <dependency>
32 <groupId>org.springframework.boot</groupId>
33 <artifactId>spring-boot-starter-test</artifactId>
34 <scope>test</scope>
35 </dependency>
36 </dependencies>
37
38 <dependencyManagement>
39 <dependencies>
40 <dependency>
41 <groupId>org.springframework.cloud</groupId>
42 <artifactId>spring-cloud-dependencies</artifactId>
43 <version>${spring-cloud.version}</version>
44 <type>pom</type>
45 <scope>import</scope>
46 </dependency>
47 </dependencies>
48 </dependencyManagement>
49
50 <build>
51 <plugins>
52 <plugin>
53 <groupId>org.springframework.boot</groupId>
54 <artifactId>spring-boot-maven-plugin</artifactId>
55 </plugin>
56 </plugins>
57 </build>
58 </project>

启动类:

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

启动类中比平时我们创建的spring boot项目多了一个  @EnableEurekaServer,这个注解的功能就是帮我启动一个服务注册中心。

application.properties 配置内容如下:

1 spring.application.name=eureka-service
2 server.port=9001
3 eureka.instance.hostname=peer1
4 #是否向注册中心注册自己,客户端需要开启,默认为开启
5 eureka.client.register-with-eureka=false
6 #是否检索服务,客户端需要开启,默认为开启
7 eureka.client.fetch-registry=false
eureka.instance.hostname 这个配置是主机名,客户端访问注册中心用到(我这里配的 peer1  需要在本地 host中加入  127.0.0.1 peer1)
eureka.client.register-with-eureka 这个配置的意思是向注册中心注册自己,因为我们这个服务时注册中心,所以不需要注册自己,设置成 fasle
eureka.client.fetch-registry 这个配置的意思是是否检索服务,服务发现的地方才需要检索服务,我们服务注册中心的职责是维护服务实例,所以也不需要,设置成false

项目建好了,配置也好了,我们来启动项目,启动好了之后,在地址栏里面输入:http://localhost:9001/

打开地址之后会看到这样的界面,说明我们注册中心启动成功了,我们发现  Instances currently registered with Eureka 这一栏是空的,说明还没有服务注册进来。

虽然我们服务注册中心起来了,但是我们想一个问题,我们的服务注册和服务发现都是依赖我们注册中心的,我们我们服务中心挂了,那我们整个微服务体系就挂了(虽然客户端可以存储服务实例列表,可以继续工作,但是也要隔端时间去服务注册中心同步的,当无法同步继续拿本地的服务实例操作时可能会引发一连贯的事故),所以我们需要保证服务注册中心的高可用,我们只要改变下配置文件,就可以达到我们的目的

我们创建一个 application-s9001.properties 文件:

spring.application.name=eureka-service
server.port=9001 eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:9002/eureka/
#服务实例元数据,设置实例名,区分同一服务中不同实例的唯一标识
eureka.instance.instance-id= ${spring.cloud.client.ip-address}:${server.port}
#启用IP地址经进行服务注册
eureka.instance.prefer-ip-address=true

再创建一个 application-s9002.properties 文件:

spring.application.name=eureka-service
server.port=9002 eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:9001/eureka/
#服务实例元数据,设置实例名,区分同一服务中不同实例的唯一标识
eureka.instance.instance-id= ${spring.cloud.client.ip-address}:${server.port}
#启用IP地址经进行服务注册
eureka.instance.prefer-ip-address=true

eureka.client.serviceUrl.defaultZone : 指定了一个服务注册中心地址,我们会把当前服务注册到这个服务注册中心上

可以看到我们这两个配置文件取消了之前针对客户端设置的两个false配置,所以我们这两个服务也是客户端,为什么了,因为我们要把这两个服务注册注册中心相互注册,我们即使eureka的服务端,又是客户端,其实eureka-service中自带了一个客户端,我们在做单服务实例时离心的会发现每隔一段时间会有一个报错,这个就是eureka-service中自带的客户端造成的,其实eureka鼓励我们使用多实例服务注册中心

我们可以看到在 s9001中 指定了服务注册中心的地址为 s9002,而 s9002 中指定了服务注册中心的地址为s9001。

我们启动两个服务指定不同的配置文件,参数如下:

-Dspring.profiles.active=s9001

-Dspring.profiles.active=s9002

如果是通过idea启动配置如下:

我们先启动 端口是9001,启动的时候会报错,我们先忽略,我们接着启动 端口是9002的服务,我们发现之前 端口9001的服务不报错了,通过 http://localhost:9001/  连接我们发现这个时候有服务有两个地址,

这个时候我们就有两个相互依赖的服务注册中心了,那这两个服务注册怎么用了,我们下一篇介绍。

SpringCloud系列(一):Eureka 注册中心的更多相关文章

  1. SpringCloud教程一:eureka注册中心(Finchley版)

    一.spring cloud简介 本阶段学习教程Spring Boot版本2.0.3.RELEASE,Spring Cloud版本为Finchley.RELEASE. Finchley版本的官方文档如 ...

  2. springcloud系列二 搭建注册中心启动

    创建modul 然后就创建完成了 添加yml文件: server: port: eureka: client: register-with-eureka: false #单机版建议设置为false,设 ...

  3. SpringCloud学习心得之Eureka注册中心的基本使用

      SpringCloud学习心得——Eureka注册中心 示范代码链接 定义 SpringCloud Eureka是 SpringCloud Netflix微服务套件的一部分,基于 REST 的服务 ...

  4. 1、eureka注册中心单机

    Spring Cloud 2.x系列之 eureka注册中心单机 一.简介 Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块.而Spring Clo ...

  5. 14 微服务电商【黑马乐优商城】:day02-springcloud(搭建Eureka注册中心)

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...

  6. Spring Cloud第二篇 | 使用并认识Eureka注册中心

    ​ 本文是Spring Cloud专栏的第二篇文章,了解前一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 ​​ 一.Sprin ...

  7. springCloud系列教程01:Eureka 注册中心集群搭建

    springCloud系列教程包含如下内容: springCloud系列教程01:Eureka 注册中心集群搭建 springCloud系列教程02:ConfigServer 配置中心server搭建 ...

  8. 跟我学SpringCloud | 第二篇:注册中心Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...

  9. Spring-cloud微服务实战【二】:eureka注册中心(上)

    ## 前言   本系列教程旨在为大家演示如何一步一步构建一整套微服务系统,至于其中的数据库用什么,订单ID如何保持唯一,分布式相关问题等等不在我们讨论范围内,本教程为了方便大家后续下载代码运行测试,不 ...

  10. F版本SpringCloud 4—Eureka注册中心开发和客户端开发

    源码地址:https://gitee.com/bingqilinpeishenme/Java-Tutorials 前言 通过前三篇文章,用大白话介绍了微服务和SpringCloud以及服务治理相关的概 ...

随机推荐

  1. 【flask】处理表单数据

     表单数据的处理涉及很多内容,除去表单提交不说,从获取数据到保存数据大致会经历以下步骤: 解析请求,获取表单数据. 对数据进行必要的转换,比如将勾选框的植转换为Python的布尔值. 验证数据是否符合 ...

  2. java利用dom4j读取xml

    java连接oracle数据库的时候, 需要从特定地方读取xml文件中的sql去get结果集, xml文件放在和java文件: SqlLoaderFromXML的目录下OracleSQL, xml文件 ...

  3. 求第n个质数

    输入一个不超过 10000 的正整数 n,求第n个质数 样例输入 10 样例输出 29 题目地址 #include<stdio.h> #include<math.h> int ...

  4. python--006

    一.函数的作用域 1.作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变 例一: name='alex' def foo(): name='lhf' def bar(): print(na ...

  5. cocos2dx基础篇(7) 触碰事件

    cocos2dx游戏引擎的重点是在于移动设备的跨平台开发,而移动设备上的游戏大部分都是通过屏幕触碰来进行的.比如主菜单的按钮触碰,打飞机中飞机的触碰移动,都需要用到触碰操作.想一想之前讲的菜单按钮CC ...

  6. Python基础语法之文件操作

    1 读文件 1.1 简单读文件 f = open('text', 'r') # f是文件句柄 data = f.read() # read方法可以加整型参数,是几就读几个字符 print(data) ...

  7. 20191128 Spring Boot官方文档学习【目录】

    Spring Boot文档 入门 使用Spring Boot 3.1. 构建系统 3.2. 结构化代码 3.3. 配置类 3.4. 自动配置 3.5. Spring beans和依赖注入 3.6. 使 ...

  8. angular - ngFor, trackby

    ngFor ngForOf指令通常使用缩写形式*ngFor为集合中的每个项呈现模板的结构指令.该指令放置在元素上,该元素将成为克隆模板的父级. <li *ngFor="let item ...

  9. String,StringBuffer,StringBulider 三者的区别

    1.String 是字符串常量,StringBuffer 和StringBuilder 是字符串变量. 2.运行速度 StringBuilder > StringBuffer > Stri ...

  10. Java中的享元设计模式,涨姿势了!

    首先来看一段代码: public class ShareTest {   public static void main(String[] args) {     Integer a = 127;   ...