走进Spring Cloud之二 eureka注册中心(Greenwich版本)

走进Spring Cloud之二 eureka注册中心(Greenwich版本)

  • eureka
  • 构建SpringCloud 工程
  • eureka 注册中心
    • eureka-server moudle
    • pom.xml
    • application.yml
    • EurekaServerApplication.java
  • eureka集群使用
    • profiles
    • /hosts
    • 编译运行

eureka

Eureka 是一个基于 REST 的服务,主要在 AWS 云中使用, 定位服务来进行中间层服务器的负载均衡和故障转移。

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka由两个组件组成:Eureka server和Eureka client。Eureka server用作服务注册服务器。Eureka client是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

最简单的微服务架构图:走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第1张图片

  • Eureka Server(注册中心):提供服务注册和发现
  • Service Provider(服务提供方):将自身服务注册到Eureka中心,从而使服务消费方能够找到
  • Service Consumer(服务消费方):从Eureka注册中心获取注册服务列表,从而能够消费服务

构建SpringCloud 工程

Spring Cloud依赖于Spring Boot,并且2者之间的版本有严重的匹配要求,这次给大家推荐一个官方Spring构建工程(传送门)网址,我们可以利用它轻松构建我们的Spring Boot工程。
走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第2张图片
例如我们这里选择Spring Cloud的相关依赖,并构建
走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第3张图片
最终网页会构建我们的Spring Boot工程并且下载到本地,我们只需要使用Idea倒入工程即可
走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第4张图片

这了我们为了给大家演示完整的SpringCloud,我们把我们当前的工程构建为SpringBoot聚合工程,我这里的聚合工程取名为scexample.

本文形成时,工程结构如下:
走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第5张图片

可以看到我的scexample聚合工程里面有很多子模块对应我们微服务的各种服务系统。这里我们后面再深入。
为了将scexample变为聚合工程,我们将刚刚自动生成的代码pom.xml稍作改动,将打包类型改为pom

	<packaging>pompackaging>

完整案例如下:


<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.0modelVersion>

	<groupId>com.pubutechgroupId>
	<artifactId>scexampleartifactId>
	<version>0.0.1-SNAPSHOTversion>
	<modules>
		<module>eureka-servermodule>
        <module>service-producermodule>
        <module>service-consumermodule>
        <module>service-zuulmodule>
        <module>service-cosumer-ribbonmodule>
    modules>
	<packaging>pompackaging>

	<name>scexamplename>
	<description>Demo project for Spring Bootdescription>

	<parent>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-parentartifactId>
		<version>2.1.0.RELEASEversion>
		<relativePath/> 
	parent>

	<properties>
		<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
		<java.version>1.8java.version>
        <spring-boot.version>2.1.0.RELEASEspring-boot.version>
		<spring-cloud.version>Greenwich.M1spring-cloud.version>
	properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-amqpartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-aopartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-data-redisartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-webartifactId>
		dependency>
		<dependency>
			<groupId>org.mybatis.spring.bootgroupId>
			<artifactId>mybatis-spring-boot-starterartifactId>
			<version>1.3.2version>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-busartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starterartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-configartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-streamartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-stream-binder-rabbitartifactId>
		dependency>

		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-devtoolsartifactId>
			<scope>runtimescope>
		dependency>
		<dependency>
			<groupId>mysqlgroupId>
			<artifactId>mysql-connector-javaartifactId>
			<scope>runtimescope>
		dependency>
		<dependency>
			<groupId>org.projectlombokgroupId>
			<artifactId>lombokartifactId>
			<optional>trueoptional>
		dependency>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-testartifactId>
			<scope>testscope>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-stream-test-supportartifactId>
			<scope>testscope>
		dependency>
	dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloudgroupId>
				<artifactId>spring-cloud-dependenciesartifactId>
				<version>${spring-cloud.version}version>
				<type>pomtype>
				<scope>importscope>
			dependency>
		dependencies>
	dependencyManagement>

	<profiles>
		<profile>
			<id>devid>
			<properties>
				<profiles.active>devprofiles.active>
				<env>devenv>
			properties>
			<activation>
				<activeByDefault>trueactiveByDefault>
			activation>
		profile>
		<profile>
			<id>testid>
			<properties>
				<profiles.active>testprofiles.active>
				<env>testenv>
			properties>
		profile>
		<profile>
			<id>prodid>
			<properties>
				<profiles.active>prodprofiles.active>
				<env>prodenv>
			properties>
		profile>
	profiles>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.bootgroupId>
				<artifactId>spring-boot-maven-pluginartifactId>
			plugin>
		plugins>
	build>

	<repositories>
		<repository>
			<id>spring-milestonesid>
			<name>Spring Milestonesname>
			<url>https://repo.spring.io/milestoneurl>
			<snapshots>
				<enabled>falseenabled>
			snapshots>
		repository>
	repositories>


project>

以上依赖项请按需修改,我这里为了演示更多的内容,一开始就导入很多依赖,完全不必要。(子模块目前还没有创建,我已经创建了所以会有,可以对应删掉)。

eureka 注册中心

eureka-server moudle

接下来,我们构建eureka-server注册中心
当前聚合工程下选择 new->moudle
走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第6张图片
接下来 next
走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第7张图片
然后填写arifactId为eureka-server
走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第8张图片
然后一路next到finish.

pom.xml

然后修改eureka-server的pom.xml如下:


<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">
    <parent>
        <artifactId>scexampleartifactId>
        <groupId>com.pubutechgroupId>
        <version>0.0.1-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>eureka-serverartifactId>
    <packaging>jarpackaging>


    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
            <version>${spring-boot.version}version>
            <optional>trueoptional>
        dependency>

        
        <dependency>
            <groupId>javax.xml.bindgroupId>
            <artifactId>jaxb-apiartifactId>
            <version>2.3.0version>
        dependency>
        <dependency>
            <groupId>com.sun.xml.bindgroupId>
            <artifactId>jaxb-implartifactId>
            <version>2.3.0version>
        dependency>
        <dependency>
            <groupId>com.sun.xml.bindgroupId>
            <artifactId>jaxb-coreartifactId>
            <version>2.3.0version>
        dependency>
        <dependency>
            <groupId>javax.activationgroupId>
            <artifactId>activationartifactId>
            <version>1.1.1version>
        dependency>
	
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

	
    <profiles>
        <profile>
            <id>peer1id>
            <properties>
                <profiles.active>peer1profiles.active>
                <env>peer1env>
            properties>
            <activation>
                <activeByDefault>trueactiveByDefault>
            activation>
        profile>
        <profile>
            <id>peer2id>
            <properties>
                <profiles.active>peer2profiles.active>
                <env>peer2env>
            properties>
        profile>
        <profile>
            <id>peer3id>
            <properties>
                <profiles.active>peer3profiles.active>
                <env>peer3env>
            properties>
        profile>
    profiles>
	
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

application.yml

resource目录下新建application.yml
配置信息如下

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    #表示是否将自己注册到Eureka Server,默认为true。
    register-with-eureka: false
    #表示是否从Eureka Server获取注册信息,默认为true。
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:
  application:
    name: eureka-server

EurekaServerApplication.java

新建自定SpringApplication的Application文件

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableEurekaServer
public class EurekaServerApplication {

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

}

那么最简单的eureka-server注册中心已经完成。
启动SpringBoot Application
访问 localhost:8761
走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第9张图片

eureka集群使用

在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。如果是单点部署,如果注册中心出现故障,将会出现毁灭性的灾难。为了维持其可用性,使用集群是很好的解决方案。Eureka通过互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署。

新建集群配置profiles:application-peer1.yml/application-peer2.yml/application-peer3.yml

走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第10张图片

application-peer1.yml

server:
  port: 8761

eureka:
  instance:
    hostname: peer1
  client:
    service-url:
      #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
      defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/

spring:
  application:
    name: eureka-server-peer1

application-peer2.yml

server:
  port: 8762

eureka:
  instance:
    hostname: peer2
  client:
    service-url:
      #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
      defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/

spring:
  application:
    name: eureka-server-peer2

application-peer3.yml

server:
  port: 8763

eureka:
  instance:
    hostname: peer3
  client:
    service-url:
      #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

spring:
  application:
    name: eureka-server-peer3

profiles

上面添加的pom.xml

	
    <profiles>
        <profile>
            <id>peer1id>
            <properties>
                <profiles.active>peer1profiles.active>
                <env>peer1env>
            properties>
            <activation>
                <activeByDefault>trueactiveByDefault>
            activation>
        profile>
        <profile>
            <id>peer2id>
            <properties>
                <profiles.active>peer2profiles.active>
                <env>peer2env>
            properties>
        profile>
        <profile>
            <id>peer3id>
            <properties>
                <profiles.active>peer3profiles.active>
                <env>peer3env>
            properties>
        profile>
    profiles>
	

/hosts

本次测试,配置/etc/hosts

127.0.0.1       localhost,peer1,peer2,peer3

编译运行

#打包
mvn clean package
mvn install

运行

java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1

java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3

再次访问 localhost:8761
走进Spring Cloud之二 eureka注册中心(Greenwich版本)_第11张图片

GitHub源代码

你可能感兴趣的:(SpringCloud,走进SpringCloud)