SpringCloud无废话入门01:最简SpringCloud应用

举报
码农星球陆敏技 发表于 2019/04/09 10:51:37 2019/04/09
【摘要】 1.创建Parent Parent很简单,创建一个空的maven项目,pom如下:<?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...

图片1.png

1.创建Parent

        Parent很简单,创建一个空的maven项目,pom如下:

<?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.zuikc</groupId>

    <artifactId>springcloud.parent</artifactId>

    <packaging>pom</packaging>

    <version>1.0-SNAPSHOT</version>

    <modules>

        <module>eureka01</module>

        <module>eureka02</module>

        <module>provider01</module>

        <module>provider02</module>

    </modules>

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.1.3.RELEASE</version>

    </parent>

</project>

        注意两个地方:

        1:spring-boot-starter-parent要被指定为整个解决方案的parent;

        2:4个Modul随着下文项目的创建会被自动创建;

2.创建eureka01

        如果说dubbo的注册中心zookeeper,那么在spring cloud中的注册中心就是:eureka,并且使用起来还要更容易上手一些。

        现在,就让我们来创建第一个eureka站点。

        首先先创建一个maven子模块,并添加公用依赖。

        类型选择如下:

n_1903251434032896193.png

        创建完毕,Pom修改为如下:

<?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/maven-v4_0_0.xsd">

    <parent>

        <artifactId>springcloud.parent</artifactId>

        <groupId>com.zuikc</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>

    <packaging>war</packaging>

    <name>eureka01</name>

    <artifactId>eureka01</artifactId>

    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-dependencies</artifactId>

                <version>Greenwich.RELEASE</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>

    <dependencies>

        <!--

            <dependency>

              <groupId>org.springframework.boot</groupId>

              <artifactId>spring-boot-starter-web</artifactId>

            </dependency>

        -->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-eureka-server</artifactId>

            <version>1.4.6.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>javax.xml.bind</groupId>

            <artifactId>jaxb-api</artifactId>

            <version>2.3.1</version>

        </dependency>

        <dependency>

            <groupId>com.sun.xml.bind</groupId>

            <artifactId>jaxb-core</artifactId>

            <version>2.3.0</version>

        </dependency>

        <dependency>

            <groupId>com.sun.xml.bind</groupId>

            <artifactId>jaxb-impl</artifactId>

            <version>2.3.1</version>

        </dependency>

        <dependency>

            <groupId>javax.activation</groupId>

            <artifactId>activation</artifactId>

            <version>1.1.1</version>

        </dependency>

    </dependencies>

</project>

        代码:

package com.zuikc;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**

 * @ClassName RegisterApplication

 * @Description 我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系“码农星球”

 * @Author 码农星球

 **/

@EnableEurekaServer

@SpringBootApplication

public class RegisterApplication {

    public static void main(String[] args) {

        SpringApplication.run(RegisterApplication.class,args);

    }

}

application.yml

server:

  port: 9091

eureka:

  instance:                   #定义Eureka实例

    hostname: eureka-9091.com #Eureka实例所在的主机名

  client:

    register-with-eureka: false #表示是否将自己注册到Eureka Server上,默认为true

    fetch-registry: false       #表示是否从Eureka Server上获取注册信息,默认为true

    service-url:

      defaultZone: http://localhost:9091/eureka/

        接着run RegisterApplication,如果没有异常报错,再从浏览器访问http://localhost:9091/,看到如下界面,则说明成功。

n_1903251435056821103.png

3.创建服务提供者provider01、provider02

        有了注册中心了,现在,让我们写两个服务提供者站点。

        服务提供者,也叫Eureka客户端,它把自己注册到Eureka服务器中,并周期性的发送心跳来更新它的服务租约。

        为什么要两个呢?为了体现分布式呀。我们创建两个子模块,它们的类型都是webapp,如下,

n_1903251435437577983.png

        Pom为:

<?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/maven-v4_0_0.xsd">

    <parent>

        <artifactId>springcloud.parent</artifactId>

        <groupId>com.zuikc</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>

    <packaging>war</packaging>

    <name>provider01</name>

    <artifactId>provider01</artifactId>

    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework.cloud</groupId>

                <artifactId>spring-cloud-dependencies</artifactId>

                <version>Greenwich.RELEASE</version>

                <type>pom</type>

                <scope>import</scope>

            </dependency>

        </dependencies>

    </dependencyManagement>

    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-eureka</artifactId>

            <version>1.4.6.RELEASE</version>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

    </dependencies>

</project>

        然后启动类为:

package com.zuikc;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**

 * @ClassName Provider1Application

 * @Description 我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系“码农星球”

 * @Author 码农星球

 **/

@SpringBootApplication

@EnableDiscoveryClient

public class Provider1Application {

    public static void main(String[] args) {

        SpringApplication.run(Provider1Application.class, args);

    }

}

        然后controller为:

package com.zuikc;

import org.springframework.context.annotation.Configuration;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

/**

 * @ClassName HelloController

 * @Description 我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系“码农星球”

 * @Author 码农星球

 **/

@Configuration

@Controller

public class HelloController {

    @RequestMapping("hello")

    @ResponseBody

    public String hello() {

        return "hello zuikc.com!";

    }

}

        然后application.yml为:

server:

  port: 9191

spring:

  application:

    name: hello-service

eureka:

  client:

    service-url:

      defaultZone: http://localhost:9091/eureka/

        注意,第二个服务项目,上面的配置中的port为9192就是了,其它配置和控制器本身的代码都一模一样。

        然后,先启动eureka,再分别启动两个服务提供者。结果如下:

n_1903251437119357483.png

4.Eureka的集群

        以下这张图是springcloud著名的架构图,

n_1903251437304872953.png

        在这张图中,我们可以看到,包括EurekaServer(即注册中心)本身,也是不止一个的。这是因为,在实际的应用中,注册中心理应是可以被集群的。这样,当集群中有分片发生故障的时候,Eureka会自动转入自我保护模式。它允许在分片发生故障的时候继续提供服务的发现和注册,当故障分配恢复时,集群中的其他分片会把他们的状态再次同步回来。

5.创建eureka02

        既然说到了注册中心的集群,那我们就来继续创建一个eureka服务器吧。

        在parent下建立子module。所有过程和创建eureka01一样,并且pom和RegistApplication也一样。

        唯一需要改变的就是配置文件。

        首先,然我们回到eureka01中,修改application.yml如下:

server:

  port: 9091

eureka:

  instance:                   #定义Eureka实例

    hostname: eureka-9091.com #Eureka实例所在的主机名

  client:

    #register-with-eureka: false #表示是否将自己注册到Eureka Server上,默认为true

    #fetch-registry: false       #表示是否从Eureka Server上获取注册信息,默认为true

    service-url:

      defaultZone: http://localhost:9092/eureka/

    server:

      enable-self-preservation: false

spring:

  application:

    name: eureka-service

        首先,我们将client下两个不允许自己注册的属性注释掉。

        同时,将service-url的地址指向到了第二个注册中心的地址。也就是说,两个注册中心要互相引用。

        其次,我们加了enable-self-preservation: false,这属性默认是开启的,如果默认开启,注册中心的服务列表就算有些服务断开了,也会继续保存。

        最后,我们加了spring这个属性节点,将本身作为服务命名为eureka-service。

        Ok,然后再来修改第二个eureka服务器的配置文件,

server:

  port: 9092

eureka:

  instance:                   #定义Eureka实例

    hostname: eureka-9092.com #Eureka实例所在的主机名

  client:

    #register-with-eureka: false #表示是否将自己注册到Eureka Server上,默认为true

    #fetch-registry: false       #表示是否从Eureka Server上获取注册信息,默认为true

    service-url:

      defaultZone: http://localhost:9091/eureka/

    server:

      enable-self-preservation: false

spring:

  application:

    name: eureka-service

        整个项目创建完毕,目录结构大概是这样的,

n_1903251438424309328.png

        接下来,让我们首先启动eureka01。注意,启动01的时候由于02还没有启动,所以会报连接不到02,但是没有关系,忽略就行,因为02马上就会启动,它会自动续约。

        接着启动eureka02,然后再启动两个provider吧。

        可以看到,4个服务都已经启动了,

n_1903251439036766433.png

        注意,这个时候去9092,也就是eureka02,也能看到这4个服务,

n_1903251439196726898.png

        感谢关注“码农星球”。本文版权属于“码农星球”。我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系我们。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。