前言

"微服务”一词源于 Martin Fowler的名为 Microservices的,博文,可以在他的官方博客上找到http:/ /martinfowler . com/articles/microservices.html简单地说,微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的 RESTfuL AP进行通信协作。常见微服务框架:Spring的spring cloud、阿里dubbo、华为ServiceComb、腾讯Tars、Facebook thrift、新浪微博Motan。本章节我们先从了解组成完整系统的各个组件开始,下章节将利用这些组件,搭建出一个完善的分布式系统。

Spring Cloud

这就不用多说了,官网有详细的介绍。

Spring Cloud Alibaba

Spring Cloud ɵɹibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务

主要组件

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo:Apache Dubbo 是一款高性能 Java RPC 框架。

Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

服务注册与发现

Eureka:官方宣布2.x不再开源(闭源),之前的版本已经停止更新;也就说Eureka将来更多的技术提升已经没有了。所以,如果希望注册中心有更多强大功能的话,还需要另辟蹊径 。

Zookeeper:在企业级Zookeeper注册中心与 Dubbo组合比较多一些,kafka使用的也是,随着Eureka的停更,我们可以通过spring-cloud-starter-zookeeper-discovery这个启动器,将Zookeeper做为springcloud的注册中心。

Consul:go语言开发的,也是一个优秀的服务注册框架,使用量也比较多。

Nacos:来自于SpringCloudɵɹibaba,在企业中经过了百万级注册考验的,不但可以完美替换Eureka,还能做其他组件的替换,所以,Naocs也强烈建议使用。

介绍下Nacos用作注册中心

Nacos简介

Nacos(Dynamic Naming and Configur ation Service) 是阿里巴巴2018年7月开源的项目,致力于发现、配置和管理微服务。

Nacos安装

单节点

--下载镜像
docker pull nacos/nacos-server:1.3.1
--启动容器
docker run --name nacos --env MODE=standalone --privileged=true -p 8848:8848 --restart=always -d dc833dc45d8f

访问:

http://127.0.0.1:8848/nacos 账号密码都是nacos

集群

安装前提

64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
集群需要依赖mysql,单机可不必
3个或3个以上Nacos节点才能构成集群
搭建Nacos高可用集群步骤:

1、需要去Nacos官网clone Nacos集群项目nacos-docker

2、nacos-docker是使用的Docker Compose对容器进行编排,所以首先需要安装Docker Compose详细信息可参照Nacos官网:https:/ /nacos.io/zh-cn/docs/quick-start-docker.html

1)安装Docker Compose

什么是Docker Compose

Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

#在Linux下下载(下载到/usr/local/bin)
curl -L https://github.com/docker/compose/releases/download/1.25.0/run.sh > /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose --version

2)克隆Nacos-docker项目

#切换到自定义目录
cd /usr/local/nacos
#开始clone
git clone https://github.com/nacos-group/nacos-docker.git

3)运行nacos-docker脚本

#执行编排命令
docker-compose -f /usr/local/nacos/nacos-docker/example/cluster-hostname.yaml up

上面的编排命令主要下载mysql镜像和nacos镜像,自动完成镜像下载/容器启动

Pulling from nacos/nacos-mysql,版本是5. 7(执行初始化脚本)

Pulling nacos3 (nacos/nacos-server:latest)最新版本

4)停止、启动

#启动
docker-compose -f /usr/local/nacos/nacos-docker/example/cluster-hostname.yaml start
#停止
docker-compose -f /usr/local/nacos/nacos-docker/example/cluster-hostname.yaml stop

5)访问Nacos

http://192.168.1.1:8848/nacos
http://192.168.1.1:8849/nacos
http://192.168.1.1:8850/nacos

Nacos快速入门

配置服务提供者

服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上。

添加nacos依赖

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${latest.version}</version>
</dependency>

添加配置

server.port=8070
spring.application.name=nacos-demo spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

启动类

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication { public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
} @RestController
class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}

启动后,控制台:

说明注册成功,后台查看该服务:

下面我们用spring cloud 整合naocs实现服务调用

配置服务消费者

添加配置

server.port=8080
spring.application.name=service-consumer spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

添加启动类:服务消费者使用 @LoadBalanced RestTemplate 实现服务调用

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication { @LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
} public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
} @RestController
public class TestController { private final RestTemplate restTemplate; @Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;} @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
}
}
}

测试

启动 ProviderApplicationConsumerApplication ,调用 http://localhost:8080/echo/2018,返回内容为 Hello Nacos Discovery 2018

分布式配置中心解决方案与应用

目前市面上用的比较多的配置中心有(时间顺序)

Disconf:2014年7月百度开源的配置管理中心,同样具备配置的管理能力,不过目前已经不维护了,最近的一次提交是4-5年前了。

Spring Cloud Config:2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。

Apollo:2016年5月,携程开源的配置管理中心,具备规范的权限、流程治理等特性。

Nacos:2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现

介绍下Nacos用作分布式配置中心

启动了 Nacos server 后,您就可以参考以下示例代码,为您的 Spring Cloud 应用启动 Nacos 配置管理服务了。完整示例代码请参考:nacos-spring-cloud-config-example

  1. 添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${latest.version}</version>
</dependency>

注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。

更多版本对应关系参考:版本说明 Wiki

  1. bootstrap.properties 中配置 Nacos server 的地址和应用名
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

spring.application.name=example

说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。
  1. 通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController { @Value("${useLocalCache:false}")
private boolean useLocalCache; @RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
  1. 首先通过调用 Nacos Open API 向 Nacos Server 发布配置:dataId 为example.properties,内容为useLocalCache=true
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=true"
  1. 运行 NacosConfigApplication,调用 curl http://localhost:8080/config/get,返回内容是 true
  2. 再次调用 Nacos Open API 向 Nacos server 发布配置:dataId 为example.properties,内容为useLocalCache=false
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=false"
  1. 再次访问 http://localhost:8080/config/get,此时返回内容为false,说明程序中的useLocalCache值已经被动态更新了。

分布式服务调用

RPC概述

RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制,让使用者不必显式的区分本地调用和远程调用。

RPC的优点:分布式设计、部署灵活、解耦服务、扩展性强。

RPC框架

Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。

Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。

Tars:腾讯内部使用的 RPC 框架,于 2017 年对外开源,仅支持 C++ 语言。

Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,提供了丰富的生态组件。

gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。

Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为

Apache:开源项目之一,支持多种语言。

RPC框架优点

RPC框架一般使用长链接,不必每次通信都要3次握手,减少网络开销。

RPC框架一般都有注册中心,有丰富的监控管理发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作协议私密,安全性较高

RPC 协议更简单内容更小,效率更高,服务化架构、服务化治理,RPC框架是一个强力的支撑。

RPC框架应用:使用Spring Cloud Alibaba 整合Dubbo实现

由于 Dubbo Spring Cloud 构建在原生的 Spring Cloud 之上, 其服务治理方面的能力可认为是 Spring Cloud Plus,不仅完全覆盖 Spring Cloud 原生特性,而且提供更为稳定和成熟的实现,特性比对如下表所示:

Dubbo 作为 Spring Cloud 服务调用

默认情况,Spring Cloud Open Feign 以及@LoadBalanced`RestTemplate 作为 Spring Cloud 的两种服务调用方式。 Dubbo Spring Cloud 为其提供了第三种选择,即 Dubbo 服务将作为 Spring Cloud 服务调用的同等公民出现,应用可通过 Apache Dubbo 注解@Service 和@Reference 暴露和引用 Dubbo 服务,实现服务间多种协议的通讯。同时,也可以利用 Dubbo 泛化接口轻松实现服务网关。

快速上手

按照传统的 Dubbo 开发模式,在构建服务提供者之前,第一个步骤是为服务提供者和服务消费者定义 Dubbo 服务接口。

为了确保契约的一致性,推荐的做法是将 Dubbo 服务接口打包在第二方或者第三方的 artifact(jar)中,该 artifact 甚至无需添加任何依赖。

对于服务提供方而言,不仅通过依赖 artifact 的形式引入 Dubbo 服务接口,而且需要将其实现。对应的服务消费端,同样地需要依赖该 artifact,并以接口调用的方式执行远程方法。接下来的步骤则是创建 artifact。

创建服务API

创建一个api模块,专门写各种接口的:

/**
* @author 原
* @date 2020/12/8
* @since 1.0
**/
public interface TestService { String getMsg();
}

创建服务提供者

导入依赖

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.2.RELEASE</version>
</dependency> <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- api接口的依赖包-->
<dependency>
<groupId>com.dubbo.demo</groupId>
<artifactId>dubbo-demo-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>

编写配置

dubbo:
scan:
# dubbo 服务扫描基准包
base-packages: org.springframework.cloud.alibaba.dubbo.bootstrap
protocol:
# dubbo 协议
name: dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
port: -1
spring:
cloud:
nacos:
# Nacos 服务发现与注册配置
discovery:
server-addr: 127.0.0.1:8848实现
/**
* @author 原
* @date 2021/1/28
* @since 1.0
**/
@Service//dubbo的service注解
public class TestServiceImpl implements TestService {
@Override
public String getMsg() {
return "123123";
}
}

启动类

/**
* @author 原
* @date 2021/1/28
* @since 1.0
**/
@SpringBootApplication
@EnableDiscoveryClient
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class,args);
}
}

创建服务消费者

除了api的实现类 其他复用提供者的代码

编写测试类

/**
* @author 原
* @date 2021/1/28
* @since 1.0
**/
@RestController
public class TestController { @Reference
TestService testService; @GetMapping("/dubbo/test")
public String getMsg(){
return testService.getMsg();
}
}

访问:

返回111

服务流量管理

为什么要流控降级

流量是非常随机性的、不可预测的。前一秒可能还风平浪静,后一秒可能就出现流量洪峰了(例如双十一零点的场景)。然而我们系统的容量总是有限的,如果突然而来的流量超过了系统的承受能力,就可能会导致请求处理不过来,堆积的请求处理缓慢,CPU/Load飙高,最后导致系统崩溃。因此,我们需要针对这种突发的流量来进行限制,在尽可能处理请求的同时来保障服务不被打垮,这就是流量控制

一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。

现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联, 最终导致整个链路都不可用。 因此我们需要对不稳定的弱依赖服务进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。

关于容错组件的停更/升级/替换

服务降级:

Hystrix:官网不极力推荐,但是中国企业中还在大规模使用,对于限流和熔断降级虽然在1 .5版本官方还支持(版本稳定),

但现在官方已经开始推荐大家使用Resilience4j

Resilience4J:官网推荐使用,但是国内很少用这个。

Sentienl:来自于Spring Cloud Alibaba,在中国企业替换Hystrix的组件,国内强烈建议使用

这里就主要介绍下Sentinel。

Sentinel介绍

Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。

Sentinel的流控操作起来非常简单,在控制台进行配置即可看见效,所见即所得

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

官网

https://github.com/alibaba/Sentinel
中文
https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
https://sentinelguard.io/zh-cn/docs/introduction.html

Sentinel 的使用可以分为两个部分:

核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 7 及以上的版本的运行时环境,同时对Dubbo / Spring Cloud 等框架也有较好的支持。

控制台(Dashboard):控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等

使用场景

 在服务提供方(Service Provider)的场景下,我们需要保护服务提供方自身不被流量洪峰打垮。 这时候通常根据服务提供方的服务能力进行流量控制, 或针对特定的服务调用方进行限制。我们可以结合前期压测评估核心口的承受能力,配置 QPS 模式的限流,当每秒的请求量超过设定的阈值时,会自动拒绝多余的请求。

 为了避免调用其他服务时被不稳定的服务拖垮自身,我们需要在服务调用端(Service Consumer)对不稳定服务依赖进行隔离和熔断。手段包括信号量隔离、异常比例降级、RT 降级等多种手段。

 当系统长期处于低水位的情况下, 流量突然增加时, 直接把系统拉升到高水位可能瞬间把系统压垮。这时候我们可以借助 Sentinel 的 WarmUp 流控模式控制通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,而不是在一瞬间全部放行。这样可以给冷系统一个预热的时间,避免冷系统被压垮。

 利用 Sentinel 的匀速排队模式进行“削峰填谷”, 把请求突刺均摊到一段时间内, 让系统负载保持在请求处理水位之内,同时尽可能地处理更多请求。

 利用 Sentinel 的网关流控特性,在网关入口处进行流量防护,或限制 API 的调用频率。

Sentinel安装

1、下载jar包https://github.com/alibaba/Sentinel/releases

2、启动

java -Dserver.port=8787 -Dcsp.sentinel.dashboard.server=127.0.0.1:8787 -Dproject.name=sentinel-dashboard -jar /home/sentinel/sentinel-dashboard-1.8.0.jar

3、访问

http://127.0.0.1:8787/#/login

初始账号密码sentinel/sentinel

可以看到sentinel是自己本身的监控

sentinel快速入门

1、导入依赖

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.0</version>
</dependency>

2、测试类

public class TestService {

    public static void main(String[] args) {
initFlowRules();
while (true) {
Entry entry = null;
try {
entry = SphU.entry("HelloWorld");
/*您的业务逻辑 - 开始*/
System.out.println("hello world");
/*您的业务逻辑 - 结束*/
} catch (BlockException e1) {
/*流控逻辑处理 - 开始*/
System.out.println("block!");
/*流控逻辑处理 - 结束*/
} finally {
if (entry != null) {
entry.exit();
}
}
}
} //设置流量控制规则 设置当QPS达到20时 会限制流量(抛出异常,可以执行处理)
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// Set limit QPS to 20.
rule.setCount(20);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
}

执行结果:

可以看到,这个程序每秒稳定输出 "hello world" 20 次,和规则中预先设定的阈值是一样的。 block表示被阻止的请求。

官方使用文档:https://github.com/alibaba/Sentinel/wiki/如何使用

Sentinel整合SpringCloud实现服务限流/熔断

导入依赖

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>

配置

server.port=8082
spring.application.name=sentinel-demo
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8787
//在需要流控的方法加上@SentinelResource
@RestController
public class TestController { @GetMapping("/sentinel")
@SentinelResource
public String getMsg(){
return "11";
}
}

启动应用,访问http://127.0.0.1:8082/sentinel后去sentinel后台

下面我们来配一条最简单的流控规则。针对 sentinel_spring_web_context /sentinel 这个服务调用配置限流规则(需要有过访问量才能看到)。我们配一条 QPS 为 1的流控规则,这代表针对该服务方法的调用每秒钟不能超过 1 次,超出会直接拒绝。

现在快速访问:http://localhost:8082/sentinel

查看实时监控页面:

其他功能的使用,大家可以参考官方文档自行摸索。

如何选择流控降级组件

以下是 Sent inel 与其它fault-tolerance 组件的对比:

分布式事务

待续...

Java进阶专题(二十二) 从零开始搭建一个微服务架构系统 (上)的更多相关文章

  1. springcloud(十四):搭建Zuul微服务网关

    springcloud(十四):搭建Zuul微服务网关 1. 2. 3. 4.

  2. 【分布式】-- 基于Nacos、OpenFeign搭建的微服务抽奖系统后台小案例

    1.项目介绍 最近入项目之前要求熟悉一下SpringCloud Nacos微服务基于Feign接口调用并整合Swagger2进行接口文档展示给前端,所以自己按照要求来编写并整合了一套基于SpringC ...

  3. 从 1.5 开始搭建一个微服务框架——日志追踪 traceId

    你好,我是悟空. 前言 最近在搭一个基础版的项目框架,基于 SpringCloud 微服务框架. 如果把 SpringCloud 这个框架当做 1,那么现在已经有的基础组件比如 swagger/log ...

  4. 在django中如何从零开始搭建一个mock服务

    mock概念 mock 就是模拟接口返回的一系列数据,用自定义的数据替换接口实际需要返回的数据,通过自定义的数据来实现对下级接口模块的测试.这里分为两类测试:一类是前端对接口的mock,一类是后端单元 ...

  5. JHipster生成微服务架构的应用栈(二)- 认证微服务示例

    本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...

  6. Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转

    原文地址:https://mp.weixin.qq.com/s/QO1QDQWnjHZp8EvGDrxZvw 这是专题的第二篇文章,看看如何搭建一个简单模式的微服务架构. 记得好久之前看到一个大牛说过 ...

  7. SpringCloud学习笔记(二):微服务概述、微服务和微服务架构、微服务优缺点、微服务技术栈有哪些、SpringCloud是什么

    从技术维度理解: 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底 地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事, 从技术角度看就是一种小而独立的处理过程,类 ...

  8. Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

    Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在 ...

  9. Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理

    Java生鲜电商平台-SpringCloud微服务架构中核心要点和实现原理 说明:Java生鲜电商平台中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务 ...

随机推荐

  1. [leetcode]207. Course Schedule课程表

    在一个有向图中,每次找到一个没有前驱节点的节点(也就是入度为0的节点),然后把它指向其他节点的边都去掉,重复这个过程(BFS),直到所有节点已被找到,或者没有符合条件的节点(如果图中有环存在). /* ...

  2. C语言结构体参数传递

    结构体的形参或实参传递和和一般的程序一样: #include<stdio.h> #include<string.h> struct student //结构体定义 { char ...

  3. php中require与include的区别

    描述:require, include三者都是引入文件,其中require_once,include_once只引入一次,即之前引入过的就不再引入. include与require的区别: 加载失败的 ...

  4. Socket.io详解

    socket.io是一个跨浏览器支持WebSocket的实时通讯的JS. http://socket.io/docs/ 由于HTTP是无状态的协议,要实现即时通讯非常困难.因为当对方发送一条消息时,服 ...

  5. Hbase集群模式搭建

    1.官网下载hbase安装包 这里不做赘述. 2.解压---直接tar -zxvf xxxx 3.配置hbase集群,要修改3个文件(首先zk集群已经安装好了) 注意:要把hadoop的hdfs-si ...

  6. 元旦在家撸了两天Seata源码,你们是咋度过的呢?

    撸Seata源码 2020年12月31日晚23点30分,我发了2020年的最后一个朋友圈:假期吃透Seata源码,有组队的吗? 不少小伙伴都来点赞了, 其中也包括Seata项目的发起人--季敏大佬哦! ...

  7. C#扫盲篇(二)依赖倒置•控制反转•依赖注入•面向接口编程--满腹经纶的说

    扫盲系列的文章收到了广大粉丝朋友的支持,十分感谢,你们的支持就是我最大动力. 我的扫盲系列还会继续输出,本人也是一线码农,有什么问题大家可以一起讨论.也可以私信或者留言您想要了解的知识点,我们一起进步 ...

  8. 腾讯IOT安卓开发初探

    目录 腾讯IOT 安卓开发初探 Tecent IOT 开发平台的使用 新建项目 创建产品 添加自定义功能 设备开发 微信小程序配置 面板配置 新建设备 使用设备 安卓开发 前置配置 data.json ...

  9. ORA-39700: database must be opened with UPGRADE option【转】

    1. 错误 数据库升级后(从11.2.0.1升级到11.2.0.4)启动报错 SQL> startup ORACLE instance started.   Total System Globa ...

  10. vue中选中弹出框内的表格

    一:可多选情况且对应勾选 由于是弹出框形式,所以会出现新增DOM与数据的改变问题,因此要使用$nextTick,不然一开始弹出得时候DOM还没有生成,却要获取DOM会报错:这种多选情况会出现一个bug ...