微服务项目核心组件

https://gitee.com/gtnotgod/spring-cloud_-alibaba_-study001.git

  • 注册中心:nacos
  • API网关:gateway
  • 生产者-消费者之间的服务远程调用:openFeign
  • 服务容灾:Sentinel实现熔断和限流

Hystrix与Sentinel 的差别

Hystrix需要程序员手工搭建监控平台

Hystrix没有一套web界面可以给我们进行更细粒度化的配置

Sentinel 的主要特性

服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

组件

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

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

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

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

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

  • Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

  • Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

  • Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

简单的微服务项目搭建



父工程依赖:

<?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.gton</groupId>
<artifactId>nacos</artifactId>
<version>1.0-SNAPSHOT</version>
<!--子模块-->
<modules>
<module>commons</module>
<module>producer</module>
<module>consumer</module>
<module>gateway</module>
<module>user_manager</module>
</modules>
<!--项目打包方式-->
<packaging>pom</packaging>
<!--Springboot父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <!--版本控制-->
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<mall.version>1.0-SNAPSHOT</mall.version>
</properties> <dependencyManagement>
<!--自定义构建的公共模块-->
<dependencies>
<dependency>
<groupId>com.gton</groupId>
<artifactId>spring-cloud-gton-common</artifactId>
<version>${mall.version}</version>
</dependency>
<!--Springcloud 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springcloud 阿里巴巴 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies> </dependencyManagement>
</project>

common:模块

<?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>nacos</artifactId>
<groupId>com.gton</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!--坐标-->
<artifactId>spring-cloud-gton-common</artifactId> <dependencies> <!--web项目驱动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--JWT鉴权-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<!-- lombok-实体类简化依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies> </project>



生产者:

<?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>nacos</artifactId>
<groupId>com.gton</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>producer</artifactId> <dependencies> <!--nacos服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> <!--web项目驱动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--feign远程调用:服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency> </dependencies> </project>

yml配置文件

server:
port: 7001 spring:
application:
#服务自动发现并注册,不需要name
name: start-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 logging:
level:
root: info
org.springframework: info

生产者的服务

package com.gton.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @program: springcloud-nacos
* @description: 生产者的controller
* @author: GuoTong
* @create: 2020-11-20 10:51
**/
@RestController
public class ProdcerController { /*日志*/
private static final Logger logger = LoggerFactory.getLogger(ProdcerController.class); @GetMapping("/service")
public String service(){
logger.info("provider invoke");
return "provider invoke";
}
}

启动器

package com.gton;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; /**
* @program: springcloud-nacos
* @description: 生产者启动类
* @author: GuoTong
* @create: 2020-11-20 10:57
**/
@SpringBootApplication//springboot启动类
@EnableDiscoveryClient //服务发现客户端
@EnableFeignClients //feign 客户端,服务远程调用
public class ProducerApplication { public static void main(String[] args) {
System.out.println("服务提供者启动成功");
SpringApplication.run(ProducerApplication.class, args);
} }



消费者

<?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>nacos</artifactId>
<groupId>com.gton</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>consumer</artifactId> <dependencies> <!--nacos服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> <!--web项目驱动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--feign远程调用:服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency> </dependencies> </project>

yml配置

server:
port: 8001 spring:
application:
name: start-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 logging:
level:
root: info
org.springframework: info

远程调用接口

package com.gton.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; /**
* @program: springcloud-nacos
* @description: 新建feign客户端:生产者
* @author: GuoTong
* @create: 2020-11-20 11:13
**/
/*远程调用哪个服务*/
@FeignClient(value = "start-provider")//生产者的微服务名
/**@FeignClient 调用服务的名称 yml配置文件的服务名*/
public interface ProducerClient { /**
* 调用服务的方法
* @return
*/
@GetMapping("/service")
public String service();
}

本地远程调用

package com.gton.controller;

import com.gton.client.ProducerClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @program: springcloud-nacos
* @description: 消费者Controller
* @author: GuoTong
* @create: 2020-11-20 11:15
**/
@RestController
public class ConsumerController { private static final Logger logger = LoggerFactory.getLogger(ConsumerController.class); /**
* 动态代理对象,内部远程调用服务生产者
*/
@Autowired
private ProducerClient producerClient; @GetMapping("/service")
public String service(){
logger.info("consumer invoke");
//远程调用
String service = producerClient.service();
return "comsumer invoke "+"|" + service;
}
}

启动器

package com.gton;

import com.gton.controller.ConsumerController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; /**
* @program: springcloud-nacos
* @description: 消费者启动类
* @author: GuoTong
* @create: 2020-11-20 11:10
**/
@SpringBootApplication
@EnableFeignClients//feign 远程调用客户端
@EnableDiscoveryClient//服务发现与注册到nacos
public class ConsumerApplication {
private static final Logger logger = LoggerFactory.getLogger(ConsumerController.class); public static void main(String[] args) { logger.info("服务消费者启动成功");
System.out.println("服务消费者启动成功");
SpringApplication.run(ConsumerApplication.class, args);
}
}



网关

网关路由配置:
# routes: # 路由规则列表(列表)
# - id: product-route # 路由规则ID
# uri: lb://product-service # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
# predicates: # 断言(判断某一个请求是否符合该路由规则)
# - Path=/product-service/** # 只要请求路径中有/product-service/就符合该规则
# filters: # 过滤器(对请求进行修改)
# - StripPrefix=1 # 去掉请求路径的第一层 # - id: order-route # 路由规则ID
# uri: lb://order-service # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
# predicates: # 断言(判断某一个请求是否符合该路由规则)
# - Path=/order-service/** # 只要请求路径中有/product-service/就符合该规则
# filters: # 过滤器(对请求进行修改)
# - StripPrefix=1 # 去掉请求路径的第一层 如果不自定义路由列表,
那么`gateway`就发现只要按照`网关地址/微服务名称/接口`的格式去默认实现一个路由列表, http://localhost:网关端口/微服务名称/Controller接口;默认规则
从而简化配置文件的书写。

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>nacos</artifactId>
<groupId>com.gton</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>com.gton.gateway</artifactId> <dependencies>
<!--springcloud第二代网关:gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--Consider defining a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' in your configuration.-->
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</exclusion>
</exclusions>&lt;!&ndash;&ndash;&gt;
</dependency>-->
<!-- nacos客户端 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> <!--feign远程调用:服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency> <!-- &lt;!&ndash;引入公共依赖:里面有JWT鉴权依赖,和工具类&ndash;&gt;
<dependency>
<groupId>com.gton</groupId>
<artifactId>spring-cloud-gton-common</artifactId>
<version>${mall.version}</version>
</dependency>--> <!--JWT鉴权-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

yml配置文件

server:
port: 10000
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
# globalcors:
# cors-configurations:
# '[/**]':
# allowedOrigins: "*"
# allowedMethods: "*"
discovery:
locator:
enabled: true # 让gateway可以发现nacos中的微服务
redis:
host: 127.0.0.1
# routes: # 路由规则列表(列表)
# - id: product-route # 路由规则ID
# uri: lb://product-service # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
# predicates: # 断言(判断某一个请求是否符合该路由规则)
# - Path=/product-service/** # 只要请求路径中有/product-service/就符合该规则
# filters: # 过滤器(对请求进行修改)
# - StripPrefix=1 # 去掉请求路径的第一层
# - id: order-route # 路由规则ID
# uri: lb://order-service # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
# predicates: # 断言(判断某一个请求是否符合该路由规则)
# - Path=/order-service/** # 只要请求路径中有/product-service/就符合该规则
# filters: # 过滤器(对请求进行修改)
# - StripPrefix=1 # 去掉请求路径的第一层
logging:
level:
cn.edu.cque.mall: debug

启动器

package com.gton;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; /**
* @program: springcloud-nacos
* @description: 网关入口
* @author: GuoTong
* @create: 2020-11-20 14:09
**/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients//原厂调用
public class GatewayApplication { public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
......

SpringCLoud_Aibaba的更多相关文章

随机推荐

  1. sklearn中MLPClassifier源码解析

    神经网络 .fit() 首先传入类私用方法._fit() 确定hidden_layer_size是可迭代的 调用_validate_hyperparameters验证超参数是否合法 验证输入的x和y是 ...

  2. Flink基础概念入门

    Flink 概述 什么是 Flink Apache Apache Flink 是一个开源的流处理框架,应用于分布式.高性能.高可用的数据流应用程序.可以处理有限数据流和无限数据,即能够处理有边界和无边 ...

  3. 使用 Win2D 实现融合效果

    1. 融合效果 在 CSS 中有一种实现融合效果的技巧,使用模糊滤镜(blur)叠加对比度滤镜(contrast)使两个接近的元素看上去"粘"在一起,如下图所示: 博客园的 Cho ...

  4. 第一个HTML

    第一个HTML <!DOCTYPE html><!--html 文件开始--><html lang="en"><!--head 文件头-- ...

  5. nginx配置文件中location的三个匹配规则定义

    #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说. #这里是直接转发给后端应用服务器了,也可以是一个静态首页 # 第一个必选规则 location = / { #prox ...

  6. Nginx反代服务器进阶学习最佳配置实践指南

    转载自:https://www.bilibili.com/read/cv16150010?spm_id_from=333.999.0.0 0x00 编译实践 描述:在企业线上生产环境中推荐进行Ngin ...

  7. 利用分层机制优化 Docker Image

    文章转载自:https://mp.weixin.qq.com/s/FrIOIquHVsCTEMfHiF87MA 假设系统中我们有两个应用 App1 和 App2.这两个节点的环境信息如下: 通过上表环 ...

  8. 修复 Elasticsearch 集群的常见错误和问题

    文章转载自:https://mp.weixin.qq.com/s/8nWV5b8bJyTLqSv62JdcAw 第一篇:Elasticsearch 磁盘使用率超过警戒水位线 从磁盘常见错误说下去 当客 ...

  9. 安装skywalking(测试使用)

    官方下载地址:https://skywalking.apache.org/downloads/ 需要: JDK8到JDK12已测试,其他版本未测试. # 在线安装jdk8 rpm -ivh https ...

  10. Traefik 2.0 暴露 Redis(TCP) 服务

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484452&idx=1&sn=0a17b907 ...