文章目录

  • 1. 系统架构
    • 1.1 流动计算架构(SOA)
    • 1.2 微服务
  • 2. 服务调用方式
    • 2.1 RPC和HTTP
    • 2.2 Http客户端工具
    • 2.3 Spring的RestTemplate
  • 3. 初识SpringCloud
    • 3.1 简介
  • 4. 微服务场景模拟
    • 4.1 服务提供者
      • 4.1.1 Spring脚手架创建工程
      • 4.1.2 编写代码
        • 4.1.2.1 配置
        • 4.1.2.2 实体类
        • 4.1.2.3 UserMapper
        • 4.1.2.4 UserService
        • 4.1.2.5 UserController
        • 4.1.3 测试
    • 4.2 服务调用者
      • 4.2.1 创建工程
      • 4.2.2 编写代码
      • 4.2.3 测试
    • 4.3 问题总结
  • 5. Eureka注册中心
    • 5.1 认识Eureka
    • 5.2 原理图
    • 5.3 入门案例
      • 5.3.1 搭建EurekaServer
      • 5.3.2 注册到Eureka
        • 5.3.2.1 pom.xml
        • 5.3.2.2 application.yml
        • 5.3.2.3 引导类
      • 5.3.3 从Eureka获取服务
    • 5.4 Eureka详解
      • 5.4.1 基础架构
      • 5.4.2 高可用的Eureka Server
      • 5.4.3 服务提供者
      • 5.4.4 服务消费者
      • 5.4.5 失效剔除和自我保护
  • 转到第二部分

1. 系统架构

1.1 流动计算架构(SOA)

SOA :面向服务的架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键
以前出现了什么问题?

  • 服务越来越多,需要管理每个服务的地址
  • 调用关系错综复杂,难以理清依赖关系
  • 服务过多,服务状态难以管理,无法根据服务情况动态管理

服务治理要做什么?

  • 服务注册中心,实现服务自动注册和发现,无需人为记录服务地址
  • 服务自动订阅,服务列表自动推送,服务调用透明化,无需关心依赖关系
  • 动态监控服务状态监控报告,人为控制服务状态

缺点:

  • 服务间会有依赖关系,一旦某个环节出错会影响较大
  • 服务关系复杂,运维、测试部署困难,不符合DevOps思想

1.2 微服务

前面说的SOA,英文翻译过来是面向服务。微服务,似乎也是服务,都是对系统进行拆分。因此两者非常容易混淆,但其实却有一些差别:

微服务的特点:

  • 单一职责:微服务中每一个服务都对应唯一的业务能力,做到单一职责
  • 微:微服务的服务拆分粒度很小,例如一个用户管理就可以作为一个服务。每个服务虽小,但“五脏俱全”。
  • 面向服务:面向服务是说每个服务都要对外暴露Rest风格服务接口API。并不关心服务的技术实现,做到与平台和语言无关,也不限定用什么技术实现,只要提供Rest的接口即可。
  • 自治:自治是说服务间互相独立,互不干扰
    • 团队独立:每个服务都是一个独立的开发团队,人数不能过多。
    • 技术独立:因为是面向服务,提供Rest接口,使用什么技术没有别人干涉
    • 前后端分离:采用前后端分离开发,提供统一Rest接口,后端不用再为PC、移动段开发不同接口
    • 数据库分离:每个服务都使用自己的数据源
    • 部署独立,服务间虽然有调用,但要做到服务重启不影响其它服务。有利于持续集成和持续交付。每个服务都是独立的组件,可复用,可替换,降低耦合,易维护

微服务结构图:

2. 服务调用方式

2.1 RPC和HTTP

无论是微服务还是SOA,都面临着服务间的远程调用。服务间的远程调用方式有

常见的远程调用方式有以下2种:

  • RPC:Remote Produce Call远程过程调用,类似的还有RMI。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型代表

  • Http:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议,也可以用来进行远程服务调用。缺点是消息封装臃肿,优势是对服务的提供和调用方没有任何技术限定,自由灵活,更符合微服务理念。

    现在热门的Rest风格,就可以通过http协议来实现。

如果公司全部采用Java技术栈,那么使用Dubbo作为微服务架构是一个不错的选择。

相反,如果公司的技术栈多样化,而且你更青睐Spring家族,那么SpringCloud搭建微服务是不二之选。在我们的项目中,我们会选择SpringCloud套件,因此我们会使用Http方式来实现服务间调用。

2.2 Http客户端工具

既然微服务选择了Http,那么我们就需要考虑自己来实现对请求和响应的处理。不过开源世界已经有很多的http客户端工具,能够帮助我们做这些事情,例如:

  • HttpClient
  • OKHttp
  • URLConnection

2.3 Spring的RestTemplate

Spring提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现了对象与json的序列化和反序列化,非常方便。RestTemplate并没有限定Http的客户端类型,而是进行了抽象,目前常用的3种都有支持:

  • HttpClient
  • OkHttp
  • JDK原生的URLConnection(默认的)

首先在项目中注册一个RestTemplate对象,可以在启动类位置注册:

@SpringBootApplication
public class HttpDemoApplication {public static void main(String[] args) {SpringApplication.run(HttpDemoApplication.class, args);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

在测试类中直接@Autowired注入:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = HttpDemoApplication.class)
public class HttpDemoApplicationTests {@Autowiredprivate RestTemplate restTemplate;@Testpublic void httpGet() {// 调用springboot案例中的rest接口User user = this.restTemplate.getForObject("http://localhost/user/1", User.class);System.out.println(user);}
}

通过RestTemplate的getForObject()方法,传递url地址及实体类的字节码,RestTemplate会自动发起请求,接收响应,并且对响应结果进行反序列化。

3. 初识SpringCloud

微服务是一种架构方式,最终肯定需要技术架构去实施。

微服务的实现方式很多,但是最火的莫过于Spring Cloud了。为什么?

  • 后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。
  • 技术强:Spring作为Java领域的前辈,可以说是功力深厚。有强力的技术团队支撑,一般人还真比不了
  • 群众基础好:可以说大多数程序员的成长都伴随着Spring框架,试问:现在有几家公司开发不用Spring?SpringCloud与Spring的各个框架无缝整合,对大家来说一切都是熟悉的配方,熟悉的味道。
  • 使用方便:相信大家都体会到了SpringBoot给我们开发带来的便利,而SpringCloud完全支持SpringBoot的开发,用很少的配置就能完成微服务框架的搭建

3.1 简介

SpringCloud是Spring旗下的项目之一,官网地址:http://projects.spring.io/spring-cloud/

Spring最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。

SpringCloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。其主要涉及的组件包括:

  • Eureka:服务治理组件,包含服务注册中心,服务注册与发现机制的实现。(服务治理,服务注册/发现)
  • Zuul:网关组件,提供智能路由,访问过滤功能
  • Ribbon:客户端负载均衡的服务调用组件(客户端负载)
  • Feign:服务调用,给予Ribbon和Hystrix的声明式服务调用组件 (声明式服务调用)
  • Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。(熔断、断路器,容错)

架构图:

4. 微服务场景模拟

4.1 服务提供者

4.1.1 Spring脚手架创建工程

借助于Spring提供的快速搭建工具:

填写项目信息:

添加web依赖:

添加mybatis依赖:

生成的项目结构,已经包含了引导类

依赖也已经全部自动引入:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zh</groupId><artifactId>service-provider</artifactId><version>0.0.1-SNAPSHOT</version><name>service-provider</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

因为要使用通用mapper,所以需要手动加一条依赖

 <dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>2.0.4</version></dependency>

4.1.2 编写代码

4.1.2.1 配置

server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456
mybatis:type-aliases-package: com.zh.service.pojo

4.1.2.2 实体类

要导入lombok依赖

package com.zh.service.pojo;
import lombok.Data;@Data
public class User {private Long id;private String name;private String pwd;
}

4.1.2.3 UserMapper

package com.zh.service.mapper;import com.zh.service.pojo.User;
import tk.mybatis.mapper.common.Mapper;
@org.apache.ibatis.annotations.Mapper
public interface UserMapper extends Mapper<User> {}

4.1.2.4 UserService

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public User queryById(Long id){return this.userMapper.selectByPrimaryKey(id);}
}

4.1.2.5 UserController

@Controller
@RequestMapping("user")
public class UserController {@Autowiredprivate UserService userService;@ResponseBody@GetMapping("{id}")public User queryById(@PathVariable Long id){return this.userService.queryById(id);}
}

4.1.3 测试

4.2 服务调用者

4.2.1 创建工程

和上述创建步骤类似,但是不需要mybatis相关依赖了

4.2.2 编写代码


首先在引导类中注册RestTemplate

@SpringBootApplication
public class ServiceConsumerApplication {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ServiceConsumerApplication.class, args);}}

编写配置(application.yml):

server:port: 80

编写UserController:

@Controller
@RequestMapping("consumer/user")
public class UserController {@Autowiredprivate RestTemplate restTemplate;@ResponseBody@GetMappingpublic User queryUserById(@RequestParam Long id){return this.restTemplate.getForObject("http://localhost:8081/user/" + id, User.class);}
}

pojo对象(User):

@Data
public class User {private Long id;private String name;private String pwd;
}

4.2.3 测试

4.3 问题总结

存在什么问题?

  • 在consumer中,我们把url地址硬编码到了代码中,不方便后期维护
  • consumer需要记忆provider的地址,如果出现变更,可能得不到通知,地址将失效
  • consumer不清楚provider的状态,服务宕机也不知道
  • provider只有1台服务,不具备高可用性
  • 即便provider形成集群,consumer还需自己实现负载均衡

其实上面说的问题,概括一下就是分布式服务必然要面临的问题:

  • 服务管理

    • 如何自动注册和发现
    • 如何实现状态监管
    • 如何实现动态路由
  • 服务如何实现负载均衡
  • 服务如何解决容灾问题
  • 服务如何实现统一配置

5. Eureka注册中心

5.1 认识Eureka

Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你。

同时,服务提供方与Eureka之间通过“心跳”机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除。

这就实现了服务的自动注册、发现、状态监控

5.2 原理图

- Eureka:就是服务注册中心(可以是一个集群),对外暴露自己的地址
  • 提供者:启动后向Eureka注册自己信息(地址,提供什么服务)
  • 消费者:向Eureka订阅服务,Eureka会将对应服务的所有提供者地址列表发送给消费者,并且定期更新
  • 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态

5.3 入门案例

5.3.1 搭建EurekaServer

创建一个项目,启动一个EurekaServer:
依然使用spring提供的快速搭建工具:

选择依赖:EurekaServer-服务注册中心依赖,Eureka Discovery-服务提供方和服务消费方。因为,对于eureka来说:服务提供方和服务消费方都属于客户端

编写application.yml配置:

server:port: 10086 # 端口
spring:application:name: eureka-server # 应用名称,会在Eureka中显示
eureka:client:service-url: # EurekaServer的地址,现在是自己的地址,如果是集群,需要加上其它Server的地址。defaultZone: http://127.0.0.1:${server.port}/eureka

修改引导类,在类上添加@EnableEurekaServer注解:

@SpringBootApplication
@EnableEurekaServer // 声明当前springboot应用是一个eureka服务中心
public class ItcastEurekaApplication {public static void main(String[] args) {SpringApplication.run(ItcastEurekaApplication.class, args);}
}

启动服务

5.3.2 注册到Eureka

注册服务,就是在服务上添加Eureka的客户端依赖,客户端代码会自动把服务注册到EurekaServer中。

修改itcast-service-provider工程

  1. 在pom.xml中,添加springcloud的相关依赖。
  2. 在application.yml中,添加springcloud的相关依赖。
  3. 在引导类上添加注解,把服务注入到eureka注册中心。

具体操作

5.3.2.1 pom.xml

先添加SpringCloud依赖:

<!-- SpringCloud的依赖 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR7</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

然后是eureka的客户端

<!-- Eureka客户端 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

5.3.2.2 application.yml

server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456application:name: service-provider
mybatis:type-aliases-package: com.zh.service.pojo
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

5.3.2.3 引导类


@SpringBootApplication
@EnableDiscoveryClient //开启Eureka客户端功能
public class ServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(ServiceProviderApplication.class, args);}}

重启项目,访问Eureka监控页面查看

service-provider服务已经注册成功

5.3.3 从Eureka获取服务

接下来修改service-consumer,尝试从EurekaServer获取服务。

方法与消费者类似,只需要在项目中添加EurekaClient依赖,就可以通过服务名称来获取信息了!
先添加SpringCloud依赖:

<!-- SpringCloud的依赖 -->
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR7</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

然后是eureka的客户端

<!-- Eureka客户端 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

修改配置

server:port: 80
spring:application:name: service-consumer
eureka:client:service-url:defaultZone: http://localhost:10086/eureka

在启动类开启Eureka客户端

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ServiceConsumerApplication.class, args);}}

修改UserController代码,用DiscoveryClient类的方法,根据服务名称,获取服务实例:

@Controller
@RequestMapping("consumer/user")
public class UserController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient; // eureka客户端,可以获取到eureka中服务的信息@ResponseBody@GetMappingpublic User queryUserById(@RequestParam Long id){//根据服务名称获取服务实例,有可能是集群,所以是service集合List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");//因为只有一个service-provider 所以获取第一个实例ServiceInstance serviceInstance = instances.get(0);//获取ip和端口信息,拼接成服务地址return this.restTemplate.getForObject("http://"+serviceInstance.getHost() +":"+serviceInstance.getPort()+"/user/" + id, User.class);}
}

启动测试

5.4 Eureka详解

5.4.1 基础架构

Eureka架构中的三个核心角色:

  • 服务注册中心

    Eureka的服务端应用,提供服务注册和发现功能,就是刚刚我们建立的itcast-eureka。

  • 服务提供者

    提供服务的应用,可以是SpringBoot应用,也可以是其它任意技术实现,只要对外提供的是Rest风格服务即可。本例中就是我们实现的itcast-service-provider。

  • 服务消费者

    消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。本例中就是我们实现的itcast-service-consumer。

5.4.2 高可用的Eureka Server

Eureka Server即服务的注册中心,在刚才的案例中,我们只有一个EurekaServer,事实上EurekaServer也可以是一个集群,形成高可用的Eureka中心。

服务同步

多个Eureka Server之间也会互相注册为服务,当服务提供者注册到Eureka Server集群中的某个节点时,该节点会把服务的信息同步给集群中的每个节点,从而实现数据同步。因此,无论客户端访问到Eureka Server集群中的任意一个节点,都可以获取到完整的服务列表信息。

动手搭建高可用的EurekaServer

我们假设要运行两个EurekaServer的集群,端口分别为:10086和10087。只需要把zh-eureka启动两次即可。

1)启动第一个eurekaServer,我们修改原来的EurekaServer配置:

server:port: 10086 # 端口
spring:application:name: eureka-server # 应用名称,会在Eureka中显示
eureka:client:service-url: # 配置其他Eureka服务的地址,而不是自己,比如10087defaultZone: http://127.0.0.1:10087/eureka

所谓的高可用注册中心,其实就是把EurekaServer自己也作为一个服务进行注册,这样多个EurekaServer之间就能互相发现对方,从而形成集群。因此我们做了以下修改:

  • 把service-url的值改成了另外一台EurekaServer的地址,而不是自己

启动报错,很正常。因为10087服务没有启动:

2)启动第二个eurekaServer,再次修改itcast-eureka的配置:

server:port: 10087 # 端口
spring:application:name: eureka-server # 应用名称,会在Eureka中显示
eureka:client:service-url: # 配置其他Eureka服务的地址,而不是自己,比如10087defaultZone: http://127.0.0.1:10086/eureka

注意:idea中一个应用不能启动两次,需要重新配置一个启动器:



然后启动即可。

3)访问集群,测试:

4)客户端注册服务到集群

因为EurekaServer不止一个,因此注册服务的时候,service-url参数需要变化:

eureka:client:service-url: # EurekaServer地址,多个地址以','隔开defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka


5.4.3 服务提供者

服务提供者要向EurekaServer注册服务,并且完成服务续约等工作。

服务注册

服务提供者在启动时,会检测配置属性中的:eureka.client.register-with-eureka=true参数是否正确,事实上默认就是true。如果值确实为true,则会向EurekaServer发起一个Rest请求,并携带自己的元数据信息,Eureka Server会把这些信息保存到一个双层Map结构中。

  • 第一层Map的Key就是服务id,一般是配置中的spring.application.name属性
  • 第二层Map的key是服务的实例id。一般host+ serviceId + port,例如:locahost:service-provider:8081
  • 值则是服务的实例对象,也就是说一个服务,可以同时启动多个不同实例,形成集群。

服务续约

在注册服务完成以后,服务提供者会维持一个心跳(定时向EurekaServer发起Rest请求),告诉EurekaServer:“我还活着”。这个我们称为服务的续约(renew);

有两个重要参数可以修改服务续约的行为:

eureka:instance:lease-expiration-duration-in-seconds: 90lease-renewal-interval-in-seconds: 30
  • lease-renewal-interval-in-seconds:服务续约(renew)的间隔,默认为30秒
  • lease-expiration-duration-in-seconds:服务失效时间,默认值90秒

也就是说,默认情况下每个30秒服务会向注册中心发送一次心跳,证明自己还活着。如果超过90秒没有发送心跳,EurekaServer就会认为该服务宕机,会从服务列表中移除,这两个值在生产环境不要修改,默认即可。

但是在开发时,这个值有点太长了,经常我们关掉一个服务,会发现Eureka依然认为服务在活着。所以我们在开发阶段可以适当调小。

eureka:instance:lease-expiration-duration-in-seconds: 10 # 10秒即过期lease-renewal-interval-in-seconds: 5 # 5秒一次心跳

5.4.4 服务消费者

获取服务列表

当服务消费者启动时,会检测eureka.client.fetch-registry=true参数的值,如果为true,则会拉取Eureka Server服务的列表只读备份,然后缓存在本地。并且每隔30秒会重新获取并更新数据。我们可以通过下面的参数来修改:

eureka:client:registry-fetch-interval-seconds: 5

生产环境中,我们不需要修改这个值。

但是为了开发环境下,能够快速得到服务的最新状态,我们可以将其设置小一点。

5.4.5 失效剔除和自我保护

服务下线

当服务进行正常关闭操作时,它会触发一个服务下线的REST请求给Eureka Server,告诉服务注册中心:“我要下线了”。服务中心接受到请求之后,将该服务置为下线状态。

失效剔除

有些时候,我们的服务提供方并不一定会正常下线,可能因为内存溢出、网络故障等原因导致服务无法正常工作。Eureka Server需要将这样的服务剔除出服务列表。因此它会开启一个定时任务,每隔60秒对所有失效的服务(超过90秒未响应)进行剔除。

可以通过eureka.server.eviction-interval-timer-in-ms参数对其进行修改,单位是毫秒,生产环境不要修改。

这个会对我们开发带来极大的不变,你对服务重启,隔了60秒Eureka才反应过来。开发阶段可以适当调整,比如:10秒

自我保护

我们关停一个服务,就会在Eureka面板看到一条警告:
这是触发了Eureka的自我保护机制。当一个服务未按时进行心跳续约时,Eureka会统计最近15分钟心跳失败的服务实例的比例是否超过了85%。在生产环境下,因为网络延迟等原因,心跳失败实例的比例很有可能超标,但是此时就把服务剔除列表并不妥当,因为服务可能没有宕机。Eureka就会把当前实例的注册信息保护起来,不予剔除。生产环境下这很有效,保证了大多数服务依然可用。

但是这给我们的开发带来了麻烦, 因此开发阶段我们都会关闭自我保护模式:(itcast-eureka)

eureka:server:enable-self-preservation: false # 关闭自我保护模式(缺省为打开)eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)

转到第二部分

SpringCloud(第一部分)相关推荐

  1. springcloud第一天,从面试题开始

    springcloud第一天,从面试题开始 1.什么是微服务? 业界大牛: 马丁·福勒 这样描述微服务: 通常而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分为一组小的服务 ...

  2. 入门微服务spring-cloud(第一章)

    springcloud 服务调用 不使用注册中心的调用方式 使用注册中心 eureka 新建一个boot服务,作为eureka的服务端 修改消息提供方 使用注册中心,并且使用RestTemplate调 ...

  3. 一、SpringCloud入门

    一.SpringCloud基本概念 1.为什么要使用SpringCloud SpringCloud并不是rpc远程调用框架,而是一套全家桶的微服务解决框架,理念就是解决我们在微服务架构中遇到的任何问题 ...

  4. java笔试题分类集锦

    合格的java工程师仅仅要有技术,还要懂得产品才能少修改,懂得测试要求,才能一次通过,懂得运维问题才能减少后期维.这些大方向体现在设计模式,程序架构,小方面就是语言的准确有效性,比如effective ...

  5. java 与大数据学习较好的网站

    C# C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿! https://www.cnblogs.com/doforfuture/p/6293926.htm ...

  6. 浅谈:分布式系统基础理论

    浅谈:分布式系统基础理论 关于文章内容仅是个人理解以及知识积累,如有版权问题,请联系我删除,谢谢. 学习分布式系统我是根据以下问题开始的: 为什么使用分布式系统? 什么是分布式系统? 1.前言 为什么 ...

  7. SpringCloudAlibaba史上最全电子书(阿里云学习中心整理)

    <Spring Cloud Alibaba>2020 本电子书内容来源于每特教育在阿里云学习中心上架课程<精通Spring Cloud Alibaba>,主讲人:余胜军,由开发 ...

  8. 本文记录Alone学习的知识点

    本文总结Alone学习的知识点 1.学习的github地址 2. Java多线程 3. java8新特性 4. SpringCloud第一代 5. SpringCloud第二代 6. 算法类 7.Ja ...

  9. Python深度学习篇

    Python深度学习篇一<什么是深度学习> Excerpt 在过去的几年里,人工智能(AI)一直是媒体大肆炒作的热点话题.机器学习.深度学习 和人工智能都出现在不计其数的文章中,而这些文章 ...

最新文章

  1. Android TextView 设置文字上下距离以及文字水平间距
  2. 以前5年只专注于.net,现今开始学习java.
  3. 机器学习-损失函数 (转)
  4. boost::iterator_property_map用法的测试程序
  5. 正则表达式2-测试代码
  6. HTTP session的原理
  7. coreseek java_基于Sphinx的中文全文检索引擎Coreseek的安装
  8. 图像处理中的几种预处理方式
  9. Qt与flash交互实现(播放Flash动画)
  10. ES集群状态一直yellow状态引发的思考
  11. 在线photoshop工具网站
  12. 《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
  13. 苹果app store水军_苹果终止App Store开发者反叛的解决方案
  14. 2021年度训练联盟热身训练赛第四场 I.Slot Machines【KMP】
  15. GlobalSign的泛域名SSL证书
  16. android版本内存卡,都8GB内存了 为何安卓手机还是这么卡?
  17. x264 代码重点详解 详细分析
  18. 阅文JAVA后端笔试
  19. matlab等高线图例如何显示,如何在MATLAB中的等高线图的等高线上放置字符串标签...
  20. Bundles of Joy

热门文章

  1. R语言:expand.grid() 函数解析
  2. 904. 水果成篮(滑动窗口)模板题
  3. 【Flask】flask入门以及第一个flask项目的创建
  4. [How TO]-ubuntu20.10上安装Pulse Secure客户端
  5. django解决跨域问题
  6. 【技术原创】MailEnable开发指南
  7. CString类的用法总结
  8. Python多线程——LOCK锁
  9. Codeforces Beta Round #9 (Div. 2 Only)【未完结】
  10. 1072 Gas Station (30 分)【难度: 中 / 知识点: Dijkstra + 枚举】