【记录贴】SpringCloud自学之路-Eureka

前言

记录一次学习SpringCloud的过程,不断积累经验,手撸方能熟能生巧。

新手上路难免有误,人非圣贤,欢迎各位指出不足之处,虚心听取各位的建议与意见。

项目源码:https://github.com/Ahua0918/hwa

一、SpringCloud简介

Spring Cloud是一系列框架的有序集合,利用Spring Boot的开发便利性巧妙的简化了分布式系统基础设施的开发,为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如服务发现,配置管理,负载均衡,消息总线BUS,断路器Hystrix,网关Zuul),运行环境简单,使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。

二、SpringCloud特性

Spring Cloud致力于为典型的用例和扩展机制提供良好的开箱即用体验

                1、分布式/版本化配置

                2、服务注册与发现

                3、路由

                4、服务与服务之间的调用

                5、负载均衡

                6、断路器

                7、全局锁

                8、分布式消息传递

                9、Leadership election and cluster state(领导选举和集群状态)

三、环境准备

首先创建一个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.lee</groupId>
        <artifactId>hwa</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>

        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.7.RELEASE</version>
            <relativePath/>
        </parent>

        <properties>
            <!-- Parent Version 父级版本-->
            <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
            <!-- Environment Settings 环境设置-->
            <java.version>1.8</java.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        </properties>

        <dependencies>
            <!--  服务注册中心必要依赖  -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>

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

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

            <!--  测试依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>

            <!--  Lombok插件依赖  -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <scope>provided</scope>
            </dependency>

            <!--  Hutool工具类 -->
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>4.6.3</version>
            </dependency>
        </dependencies>

        <!-- 对版本号进行管理,不会实际导入jar-->
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>    <!--  jar
                        包身份限定  -->
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

        <build>
            <pluginManagement>
                <plugins>
                    <!-- Compiler Plugin 编译器插件-->
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <showWarnings>true</showWarnings>
                        </configuration>
                    </plugin>

                    <!--  编译器插件  指定JDK版本-->
                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <target>${java.version}</target>
                            <source>${java.version}</source>
                            <encoding>${project.build.sourceEncoding}</encoding>
                        </configuration>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
        <repositories>
            <!--  阿里云主仓库,代理了maven central和jcentral仓库-->
            <repository>
                <id>aliyun</id>
                <name>aliyun</name>
                <url>https://maven.aliyun.com/repository/public</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
            <!--阿里云代理Spring 官方仓库-->
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>https://maven.aliyun.com/repository/spring</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
        <pluginRepositories>
            <!--  阿里云代理Spring 插件仓库-->
            <pluginRepository>
                <id>spirng-plugin</id>
                <name>spring-plugin</name>
                <url>https://maven.aliyun.com/repository/spring-plugin</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
</project>

四、创建Eureka服务注册中心

基于Maven父项目创建一个子项目,右击项目--Module--选择Maven--选择对应JDK版本--点击Next--输入模块名hwa-eureka即可  

2.1  注册中心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>
        <parent>
            <artifactId>hwa</artifactId>
            <groupId>com.lee</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>


        <artifactId>hwa-eureka</artifactId>
        <packaging>jar</packaging>


        <description>SuperRegistry</description>

        <dependencies>
            <!--    Eureka Server服务注册中心   -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>
</project>

2.2  编写配置文件application.yml

#注册中心端口
server:
  #默认端口8761
  port: 1116

#主机名
eureka:
  instance:
    hostname: localhost
  client:
    #表示本应用是否向注册中心注册自己(配置高可用的时侯需要设置为true)
    register-with-eureka: false
    #表示是否去检索服务
    fetch-registry: false
    #eureka服务地址
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

2.3  编写EurekaServer启动类

       EurekaServer启动类扮演的角色是注册中心,用于注册各种微服务,以便于其他微服务找到和访问。

package com.lee.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer     //通过注解@EnableEurekaServer表示是个EurekaServer
public class HwaEurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(HwaEurekaApplication.class,args);
    }
}

2.4  启动并访问

       运行HwaEurekaApplication,并访问http://localhost:1116/

五、注册数据微服务  Eureka-Client

同样基于Maven父项目创建子项目,右击项目--Module--选择Maven--选择对应JDK版本--点击Next--输入模块名hwa-eureka-client即可

5.1  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>
        <parent>
            <artifactId>hwa</artifactId>
            <groupId>com.lee</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>


        <artifactId>hwa-eureka-client</artifactId>
        <packaging>jar</packaging>


        <description>SuperClient</description>

        <dependencies>
            <!--  表示这是个Eureka客户端  -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>
</project>

5.2  编写配置文件application.yml

spring:
  application:
    #服务名称
    name: hwa-eureka-client
#主机名
eureka:
  client:
    #eureka服务地址
    #注明自己的服务注册中心的地址,与Eureka Server中的配置application.yml相对应
    service-url:
      defaultZone: http://localhost:1116/eureka/

5.3  编写EurekaClient启动类

package com.lee.client;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.NumberUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Scanner;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

@SpringBootApplication
@EnableEurekaClient     //通过注解@EnableEurekaClient表示是个EurekaClient
@RestController
public class HwaClientApplication {
    //通过输入端口号,可以启动多个EurekaClient
    public static void main(String[] args) {
        int port = 0;
        int defaultPort = 1118;
        Future<Integer> future = ThreadUtil.execAsync(() -> {
            int p = 0;
            System.out.println("请于5秒钟内输入端口号, 推荐  1118 、 1119  或者  1120,超过5秒将默认使用" + defaultPort);
            Scanner scanner = new Scanner(System.in);
            while (true) {
                String strPort = scanner.nextLine();
                if (!NumberUtil.isInteger(strPort)) {
                    System.err.println("只能是数字");
                    continue;
                } else {
                    p = Convert.toInt(strPort);
                    scanner.close();
                    break;
                }
            }
            return p;
        });
        try {
            port = future.get(5, TimeUnit.SECONDS);
        } catch (InterruptedException | ExecutionException | TimeoutException e) {
            port = defaultPort;
        }
        if (!NetUtil.isUsableLocalPort(port)) {
            System.err.printf("端口%d被占用了,无法启动%n", port);
            System.exit(1);
        }
        new SpringApplicationBuilder(HwaClientApplication.class).properties("server.port=" + port).run(args);
    }

    @Value("${server.port}")
    String port;

    @RequestMapping("/hi")
    public String home(@RequestParam String name) {
        return "hi " + name + ",i am from port:" + port;
    }
}

5.3  启动微服务

       依次启动HwaEurekaApplication,HwaClientApplication,可以在服务注册中心http://localhost:1116/看到hwa-eureka-client这个微服务,端口为1118的实例

5.3  访问微服务

       可以如此访问:http://localhost:1118/hi?name=hwa,(可以启动多个),可以在浏览器上看到

      但是这种方式是通过 http 协议 访问微服务本身,和注册中心没有关系,也观察不到集群的效果,接下来学习视图微服务(用微服务,访问另外一个微服务)

             

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值