前言
记录一次学习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 协议 访问微服务本身,和注册中心没有关系,也观察不到集群的效果,接下来学习视图微服务(用微服务,访问另外一个微服务)