SpringCloud 学习笔记01 服务注册与发现
一、Spring Cloud简介
二、创建服务注册中心
采用Eureka作为服务注册与发现的组件
首先创建一个maven主工程 两个子工程一个model工程作为服务注册中心,即Eureka Server,另一个作为Eureka Client。
在其父pom文件引入依赖,spring Boot版本为2.1.5.RELEASE,Spring Cloud版本为Greenwich.RELEASE。后面同系列文章其父pom文件与其保持一致。
父pom文件起到依赖版本控制的作用,其他module工程继承该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.xdarker</groupId>
<artifactId>sc-demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>sc-demo1</name>
<modules>
<module>eureka-server</module>
<module>service-hi</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--只是对版本进行管理,不会实际引入jar-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
</project>
Eureka Server pom.xml继承了父pom文件,并引入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">
<parent>
<artifactId>sc-demo1</artifactId>
<groupId>com.xdarker</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server</artifactId>
<packaging>jar</packaging>
<name>eureka-server</name>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动一个服务注册中心,只需要一个注解@EnableEurekaServer,这个注解需要在springboot工程的启动application类上加:
package com.xdarker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Hello world!
*
*/
@SpringBootApplication
//启动一个服务注册中心
@EnableEurekaServer
public class EurekaServerApplication
{
public static void main( String[] args )
{
SpringApplication.run(EurekaServerApplication.class,args);
}
}
eureka server的配置文件appication.yml:
eureka:
client:
#此客户端是否获取eureka服务器注册表上的注册信息,默认为true
fetch-registry: false
#实例是否在eureka服务器上注册自己的信息以提供其他服务发现,默认为true
register-with-eureka: false
instance:
hostname: localhost
server:
port: 11000
spring:
application:
name: eureka-server
eureka server 是有界面的,启动工程,打开浏览器访问:http://localhost:11000,界面如下:
三、创建一个服务提供者 (eureka client)
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">
<parent>
<artifactId>sc-demo1</artifactId>
<groupId>com.xdarker</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-hi</artifactId>
<packaging>jar</packaging>
<name>service-hi</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
通过注解@EnableDiscoveryClient 表明自己是一个eurekaclient
package com.xdarker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* Hello world!
*
*/
@SpringBootApplication
@EnableDiscoveryClient
//@EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到改服务。
//不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
public class Application
{
public static void main( String[] args )
{
SpringApplication.run(Application.class,args);
}
}
Controller类
package com.xdarker.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 文件名称:ServiceHiController
* 本类描述:
* 日期:2019/5/27 11:16
*
* @author XDrker
* @version 1.0
*/
@RestController
public class ServiceHiController {
@Value("${server.port}")
String port;
@GetMapping("/hi")
public String home(@RequestParam(value = "name") String name) {
return "hi " + name + " ,i am from port:" + port;
}
}
在配置文件中注明自己的服务注册中心的地址,application.yml配置文件如下:
eureka:
client:
serviceUrl:
# eureka.client.serviceUrl.defaultZone属性对应服务注册中心的配置内容,指定服务注册中心的位置
defaultZone: http://localhost:11000/eureka/
server:
port: 12001
spring:
application:
name: service-hi
需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。
启动工程,打开http://localhost:12001 ,即eureka server 的网址:
你会发现一个服务已经注册在服务中了,服务名为SERVICE-HI ,端口为12001
这时打开 http://localhost:8762/hi?name=XDrker ,你会在浏览器上看到 :
问题:将客户端关闭后,再次打开Eureka的注册页面,发现有一串红字:
Eureka的自我保护模式
默认情况下,如果EurekaServer在一定时间内没有接收到某个微服务实例的心跳时,EurekaServer将会注销该实例(默认90s)。但是当网络发生故障时,微服务与EurekaServer之间无法通信,这样就会很危险了,因为微服务本身是很健康的,此时就不应该注销这个微服务,而Eureka通过自我保护机制来预防这种情况,当网络健康后,该EurekaServer节点就会自动退出自我保护模式;
这时再次将客户端微服务启动,刷新服务注册中心会发现,自我保护状态已取消。
参考博客:方志朋
推荐阅读
-
springcloud干货之服务注册与发现(Eureka)
-
SpringCloud之服务注册与发现Spring Cloud Eureka实例代码
-
springcloud使用之服务的注册发现与消费
-
SpringCloud-微服务的注册与发现Eureka
-
SpringCloud(二):服务的注册与发现(Eureka)
-
SpringCloud:1章 Eureka服务注册与发现
-
微服务学习笔记(2)——使用Consul 实现 MagicOnion(GRpc) 服务注册和发现
-
SpringCloud第二代实战系列:一文搞定Nacos实现服务注册与发现
-
springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版
-
每天学点SpringCloud(二):服务注册与发现Eureka