这是一个从零开始的springcloud的系列教程,如果你从中间开始看,可能会看不明白.进入我的博客查看其他文章
前言
在之前课程中,我们学会创建了多工程项目,spring-cloud-learn.
搭建的项目有:
- eureka-server:一个eureka服务治理工程
- eureka-client: 一个eureka微服务工程
- eureka-client2: 一个eureka微服务工程
我们学会了多工程项目的建立,现在来学习eureka微服务如何向eureka服务治理中心进行注册
什么是服务注册
想象一下,我们的项目由多个服务组成,订单服务,用户服务,结算服务等.
在服务引用并不算多的时候,可以通过静态配置来完成服务的调用,但随着业务的发展,系统功能越来越复杂,相应的微服务也不断增加,此时静态配置会变得越来越难以维护。并且面对不断发展的业务,集群规模,服务的位置、服务的命名等都有可能发生变化,如果还是通过手工维护的方式,极易发生错误或是命名冲突等问题。同时,也将消耗大量的人力来维护静态配置的内容。为了解决微服务架构中的服务实例维护问题,就产生了大量的服务治理框架和产品。这些框架和产品的实现都围绕着服务注册与服务发现机制来完成对微服务应用实例的自动化管理。
服务注册
在服务治理框架中,通常会建立一个注册中心,每个服务向服务注册中心登记自己的提供的服务.
登记主要内容有:
- ip地址
- 端口号
- 版本号
- 通信协议
- 服务名称
有了以上登记的内容,注册中心按照服务名称进行组织分类.
比如有两个名字叫服务A的进程,三个名字叫服务B的进程向注册中心进行注册:
服务名称 | 服务ip地址 |
---|---|
A | 192.168.0.100:8000、192.168.0.101:8000 |
B | 192.168.0.100:8001、192.168.0.101:8001、192.168.0.102:8002 |
上方的列表就是注册中心组织分类后的结果.
Netflix Eureka
Spring cloud Eureka ,使用 Netflix Eureka 来实现服务注册与发现,它即包含了服务端组件,也包含了客户端组件,并且服务端和客户端均采用Java编写,所以 Eureka 主要适用于通过 Java实现的分布式系统,或是与JVM兼容语言构建的系统。但是,Eureka服务端的服务治理机制提供了完备的RESTful API,所以也支持将非 Java语言构建的微服务应用纳入Eureka 的服务治理体系中来。只是在使用其他语言平台时,需要自己来实现Eureka的客户端程序。
Eureka服务端:也称为服务注册中心。它和其他服务注册中心一样,支持高可用配置。
Eureka客户端:主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新它的服务租约。同时也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性的刷新服务状态。
Eureka服务端创建
打开我们第一节课创建的工程,spring-cloud-learn,选中pom.xml.如果没有看过第一节课,点击多Maven工程查看
- 添加spring-boot和spring-cloud的依赖管理,使用的spring-cloud版本为Finchley.SR2版本
- 添加spring-boot-starter依赖,等于所有子工程都引入spring-boot依赖
- 添加spring-boot-maven-plugin到maven插件,必须引入该插件maven才能打包编译spring-boot项目
完成的pom.xml代码
<?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.jack</groupId>
<artifactId>spring-cloud-learn</artifactId>
<version>1.0-SNAPSHOT</version>
<!--主工程配置子工程的地方-->
<modules>
<module>eureka-server</module>
<module>eureka-client</module>
<module>eureka-client2</module>
<module>common</module>
</modules>
<!--设置maven工程类型为pom类型-->
<packaging>pom</packaging>
<properties>
<!--
maven项目会用maven-compiler-plugin默认的jdk版本来进行编译,
下面两个参数是告诉maven编译器使用jdk版本,
-->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<default.version>1.0-SNAPSHOT</default.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring-boot依赖管理-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.8.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-cloud依赖管理-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--直接写版本号写法-->
<!--<dependency>-->
<!--<groupId>com.jack</groupId>-->
<!--<artifactId>common</artifactId>-->
<!--<version>1.0-SNAPSHOT</version>-->
<!--</dependency>-->
<!--使用property的写法-->
<dependency>
<groupId>com.jack</groupId>
<artifactId>common</artifactId>
<version>${default.version}</version>
</dependency>
<dependency>
<groupId>com.jack</groupId>
<artifactId>eureka-client</artifactId>
<version>${default.version}</version>
</dependency>
<dependency>
<groupId>com.jack</groupId>
<artifactId>eureka-client2</artifactId>
<version>${default.version}</version>
</dependency>
<dependency>
<groupId>com.jack</groupId>
<artifactId>eureka-server</artifactId>
<version>${default.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<!--引入spring-boot依赖,等于所有子工程都引入spring-boot依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!--spring-boot的maven打包插件,必须引入该插件maven才能打包编译spring-boot项目-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
打开eureka-server工程中的pom.xml文件,配置spring-cloud-starter-netflix-eureka-server
<?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">
<!--继承主工程的pom.xml-->
<parent>
<artifactId>spring-cloud-learn</artifactId>
<groupId>com.jack</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server</artifactId>
<dependencies>
<!--引入eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--引入common工程-->
<dependency>
<groupId>com.jack</groupId>
<artifactId>common</artifactId>
<!--<version>1.0-SNAPSHOT</version>-->
</dependency>
</dependencies>
</project>
修改EurekaServerApplication文件
@SpringBootApplication是启动SpringBoot的注解
@EnableEurekaServer是启动eureka服务端注解
package com.jack.eureka_server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
添加application.yml文件
配置为
server:
port: 7770
eureka:
# server:
# # 是否开启安全检测
# enable-self-preservation: false
instance:
# 主机名称
hostname: localhost
client:
# 表示不向注册中心中注册自己
register-with-eureka: false
# 表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
# 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖这个地址(服务暴露的地址)
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
# 服务名称
name: eurka-server
启动后,网页输入localhost:7770.可以看到页面
到这里,Eureka服务端已经启动起来了
创建Eureka客户端
添加spring-cloud-starter-netflix-eureka-client依赖到eureka-client工程
pom.xml为
<?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">
<parent>
<artifactId>spring-cloud-learn</artifactId>
<groupId>com.jack</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-client</artifactId>
<dependencies>
<!--
一定要写称spring-cloud-starter-netflix-eureka-client
如果写错成spring-cloud-netflix-eureka-client,将无法注册
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
给eureka-client工程添加EurekaClientApplication类.
代码为:
package com.jack.eureka_client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
//@EnableEurekaClient (Finchley.SR2已经不需要该配置了,你只需要在配置文件中含有eureka.client.enabled的配置即可)
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
启动服务,打开localhost:7770,你会发现有一个名称为EUREKA-CLIENT服务被注册在服务中心
更多
我们已经搭起了服务治理的服务端和客户端
如果我们将eureka-client2也启动起来,端口为7772,并且服务名称一致,将会是这样
EUREKA-CLIENT服务成为一个集群服务.