一、背景

  • 身为Java程序员,微服务是必须要掌握的一种架构。Spring Cloud作为提供微服务架构的完整技术生态链,给我们提供了非常多的框架与组件。其中的重要成员Spring Cloud Netflix也形成了一系列的技术栈:包括服务注册与发现(Eureka),断路器(Hystrix),智能路由(Zuul)和客户端负载平衡(Ribbon)等。
  • 但不幸的是Spring Cloud Netflix的技术栈相继宣布进行维护阶段:



二、初识Spring Cloud Alibaba

  • 做为国内互联网大厂的阿里巴巴,在开源领域的成就有目共睹。
  1. 2016 年,阿里全面拥抱 Spring Boot;
  2. 2017 年 12 月,Spring Cloud Alibaba 立项并顺利进入 Spring Cloud 孵化器。
  3. 2019 月 10 月 3 日,Spring Cloud Alibaba 正式 "挂牌" Spring 官方。

    关于Spring Cloud Alibaba的孵化过程具体可参考:《Spring Cloud Alibaba 从孵化到 "挂牌" 之旅》

同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

(图片来源:阿里云云栖号)

  • 做为微服务生态圈中冉冉升起的一颗新星,我们有理由去了解并掌握Spring Cloud Alibaba的各个技术栈。本文也将通过项目工程演练的方式对Spring Cloud Alibaba中的服务治理组件Nacos与高可用防护组件Sentinel进行基础实践。

三、Nacos的基础实践

  • 在2018年 6 月份 Aliware 技术行上海站 Dubbo 开发者沙龙上,阿里巴巴高级技术专家郭平 (坤宇) 宣布了阿里巴巴的一个新开源项目 Nacos。

Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

  1. Kubernetes Serviceg
  2. RPC & Dubbo RPC Service
  3. Spring Cloud RESTful Service

    Nacos生态图(来自Nacos官网)

3.1 安装Nacos并启动服务

  • 获取Nacos安装文件并进行解压
  1. # 下载nacos最新版
  2. wget https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.tar.gz
  3. # 解压文件
  4. tar -xvf nacos-server-1.3.2.tar.gz
  5. # 通过nacos-mysql.sql脚本建立数据库
  6. cd nacos/conf
  7. vim nacos-mysql.sql
  • 建立Nacos配置数据库
  1. /******************************************/
  2. /* 数据库全名 = nacos_config */
  3. /* 表名称 = config_info */
  4. /******************************************/
  5. CREATE TABLE `config_info` (
  6. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  7. `data_id` varchar(255) NOT NULL COMMENT 'data_id',
  8. `group_id` varchar(255) DEFAULT NULL,
  9. `content` longtext NOT NULL COMMENT 'content',
  10. `md5` varchar(32) DEFAULT NULL COMMENT 'md5',
  11. `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  12. `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  13. `src_user` text COMMENT 'source user',
  14. `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
  15. `app_name` varchar(128) DEFAULT NULL,
  16. `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
  17. `c_desc` varchar(256) DEFAULT NULL,
  18. `c_use` varchar(64) DEFAULT NULL,
  19. `effect` varchar(64) DEFAULT NULL,
  20. `type` varchar(64) DEFAULT NULL,
  21. `c_schema` text,
  22. PRIMARY KEY (`id`),
  23. ...

  • 修改配置文件
  1. cd nacos/conf
  2. # 编辑配置文件
  3. vim application.properties
  4. #*************** Spring Boot Related Configurations ***************#
  5. ### Default web context path:
  6. server.servlet.contextPath=/nacos
  7. ### Default web server port:
  8. server.port=8848
  9. #*************** Network Related Configurations ***************#
  10. ### If prefer hostname over ip for Nacos server addresses in cluster.conf:
  11. # nacos.inetutils.prefer-hostname-over-ip=false
  12. ### Specify local server's IP:
  13. # nacos.inetutils.ip-address=
  14. #*************** Config Module Related Configurations ***************#
  15. ### If use MySQL as datasource:
  16. spring.datasource.platform=mysql
  17. ### Count of DB:
  18. db.num=1
  19. ### Connect URL of DB:
  20. db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
  21. db.user=root
  22. db.password=root
  • 运行nacos
  1. cd nacos/bin
  2. # 单机运行
  3. sh startup.sh -m standalone
  • 登录nacos控制台

3.2 建立微服务并向Nacos注册服务

  • 建立微服务工程项目



  • 勾选Nacos Service Discovery依赖

  • 打开pom.xml,下载依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.2.9.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>nacos.democonsumer</groupId>
  12. <artifactId>sentinel</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>sentinel</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.alibaba.cloud</groupId>
  27. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. <exclusions>
  34. <exclusion>
  35. <groupId>org.junit.vintage</groupId>
  36. <artifactId>junit-vintage-engine</artifactId>
  37. </exclusion>
  38. </exclusions>
  39. </dependency>
  40. </dependencies>
  41. <dependencyManagement>
  42. <dependencies>
  43. <dependency>
  44. <groupId>com.alibaba.cloud</groupId>
  45. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  46. <version>${spring-cloud-alibaba.version}</version>
  47. <type>pom</type>
  48. <scope>import</scope>
  49. </dependency>
  50. </dependencies>
  51. </dependencyManagement>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. </plugin>
  58. </plugins>
  59. </build>
  60. </project>
  • 设置项目配置文件:application.yml
  1. # 端口
  2. server:
  3. port: 8083
  4. spring:
  5. application:
  6. name: goods-service
  7. cloud:
  8. # nacos服务注册
  9. nacos:
  10. discovery:
  11. server-addr: 172.16.109.118:8848
  • 通过 Spring Cloud Alibaba原生注解 @EnableDiscoveryClient 开启服务注册发现功能
  1. // 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
  2. @EnableDiscoveryClient
  3. @SpringBootApplication
  4. public class DemoServiceApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(DemoServiceApplication.class, args);
  7. }
  8. }
  • 建立HTTP接口的商品信息微服务,模拟返回商品列表
  1. /**
  2. * 商品信息微服务-模拟返回商品列表
  3. */
  4. @RestController
  5. @RequestMapping("api/goods")
  6. public class GoodsService {
  7. public static final Logger logger = LoggerFactory.getLogger(GoodsService.class);
  8. // 返回商品列表
  9. @GetMapping
  10. public List<Goods> getAllGoods(HttpServletRequest httpServletRequest) {
  11. List<Goods> goods = new ArrayList<>();
  12. goods.add(new Goods("电脑", 10));
  13. goods.add(new Goods("手机", 20));
  14. goods.add(new Goods("书籍", 30));
  15. logger.info("服务被调用:"+httpServletRequest.getRequestURI());
  16. return goods;
  17. }
  18. }
  • 启动微服务程序

  • 查看Nacos控制台的服务中心列表,可以看到商品信息微服务已在Nacos注册成功

3.3 建立微服务消费者进行服务调用

  • 仿照以上3.2小节建立微服务提供者步骤,建立服务消费者工程项目;
  • 打开pom.xml,下载依赖
  1. ...
  2. <!-- 加入Nacos Discovery Client 依赖 -->
  3. <dependency>
  4. <groupId>com.alibaba.cloud</groupId>
  5. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  6. </dependency>
  7. ...
  • 项目配置:application.yml
  1. # 端口
  2. server:
  3. port: 8090
  4. # Spring配置
  5. spring:
  6. application:
  7. name: user-consumer
  8. cloud:
  9. nacos:
  10. discovery:
  11. server-addr: 172.16.109.118:8848
  12. enabled: true
  13. # 调用微服务超时时间设置
  14. ribbon:
  15. ConnectTimeout: 5000
  16. ReadTimeout: 5000
  17. # feign日志以什么级别监控哪个接口
  18. logging:
  19. level:
  20. nacos.democonsumer.GoodService : debug
  21. # 商品微服务地址
  22. service
  23. url=http://goods-service/
  • 通过 Spring Cloud Alibaba原生注解 @EnableDiscoveryClient 开启服务发现功能,并向Spring注册一个RestTemplate Bean
  1. @EnableDiscoveryClient
  2. @SpringBootApplication
  3. public class DemoConsumerApplication {
  4. // 向Spring注册一个RestTemplate Bean
  5. @Bean
  6. // 负载均衡
  7. @LoadBalanced
  8. RestTemplate restTemplate(){
  9. return new RestTemplate();
  10. }
  11. public static void main(String[] args) {
  12. SpringApplication.run(DemoConsumerApplication.class, args);
  13. }
  14. }
  • 创建Restful测试接口,通过该测试接口可发现并调用Nacos中注册的商品信息微服务
  1. /**
  2. * 用户消费者--调用nacos服务中心的商品信息微服务,并对外提供RestFul接口测试
  3. */
  4. @RestController
  5. @RequestMapping("user/")
  6. public class UserConsumer {
  7. @Autowired
  8. private RestTemplate restTemplate;
  9. @Value("${service.url}")
  10. private String url;
  11. @GetMapping("/goods")
  12. public User getUserGoods() {
  13. User user = new User();
  14. // 调用商品微服务
  15. Object response = restTemplate.getForEntity(url + "api/goods", Object.class).getBody();
  16. try {
  17. user.setName("jack");
  18. user.setGoods((List<GoodsDTO>) response);
  19. } catch (Exception e){
  20. throw new RuntimeException(e.getMessage());
  21. }
  22. return user;
  23. }
  24. }
  • 运行服务消费者程序,并打开HttpClient工具进行测试



3.4 Nacos小结

  • Spring Cloud Alibaba 的Nacos组件可以完美取代Eureka做为微服务发现及注册的基础框架。
  • 通过Nacos特性大图中,我们还可以了解到,Nacos除了服务发现的框架,还能做到配置管理,DNS服务等功能。

四、Sentinel的基础实践

4.1 安装Sentinel监控

  1. # 下载服务端
  2. wget https://github.com/alibaba/Sentinel/releases/download/v1.8.0/sentinel- dashboard-1.8.0.jar
  3. # 启动服务(默认端口为8080)
  4. java -jar sentinel-dashboard-1.8.0.jar
  • 登录控制台,默认用户名与密码为sentinel



4.2 通过Sentinel对微服务提供方进行流量控制

  • 对原有商品信息微服务提供者增加Sentinel依赖
  1. <project>
  2. ...
  3. <dependency>
  4. <groupId>com.alibaba.cloud</groupId>
  5. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  6. </dependency>
  7. ...
  8. </project>
  • 修改项目配置文件application.yml增加Sentinel控制台地址
  1. server:
  2. port: 8083
  3. spring:
  4. application:
  5. name: goods-service
  6. cloud:
  7. # nacos服务注册
  8. nacos:
  9. discovery:
  10. server-addr: 172.16.109.118:8848
  11. # sentinel服务
  12. sentinel:
  13. transport:
  14. dashboard: 172.16.109.118:8080
  • 运行微服务程序,通过Nacos控制台观察微服务注册信息

  • 我们再通过HttpClient工具访问一下微服务的Api端口,并进入Sentinel控制台进行监控:在控制台中,我们发现了服务名称,及该服务下的各种规则设置菜单。

4.2.1 通过JMeter模拟高并发流量

  • 设置20000个并发请求

  • 设置HTTP请求地址:

  • 设置报告输出

  • 启动JMeter,观察Sentinel控制台,可以看到QPS的实时状况。

4.2.2 设置流控规则进行流量控制

  • 对Sentinel控制台中服务的资源增加流量控制规则

  • 给微服务接口的QPS设置阈值



  • 再次启动JMeter进行高并发测试,在控制台中进行观察,可以看到服务接口的QPS被限制在阈值以下。

  • JMeter结果列表中可以观察到异常信息。

4.2.3 设置降级规则进行流量控制

  • 对Sentinel控制台中服务的资源增加熔断降级规则

慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

  • 在实时监控界面可以看到请求被拒绝,证明熔断降级规则生效

  • 在JMeter结果表格中也出现了大量失败的调用请求

4.3 通过Sentinel对微服务调用方进行流量控制

  • Sentinel流程控制组件除了可以在微服务端进行必要的流量控制外,也可以在服务调用方的客户端进行控。,
  • 微服务调用方加入OpenFeign组件
  1. <-- pom.xml -->
  2. <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-openfeign</artifactId>
  6. <version>2.2.5.RELEASE</version>
  7. </dependency>
  • 项目配置
  1. server:
  2. port: 8090
  3. spring:
  4. application:
  5. name: user-consumer
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 172.16.109.118:8848
  10. # sentinel服务
  11. sentinel:
  12. transport:
  13. dashboard: 172.16.109.118:8080
  14. # 调用微服务超时时间设置
  15. ribbon:
  16. ConnectTimeout: 5000
  17. ReadTimeout: 5000
  18. # feign日志以什么级别监控哪个接口
  19. logging:
  20. level:
  21. nacos.democonsumer.GoodService : debug
  22. # 启用sentinel
  23. feign:
  24. sentinel:
  25. enabled: true
  • 主启动类增加注解
  1. /**
  2. * 主启动类
  3. */
  4. // 启用Feign组件
  5. @EnableFeignClients
  6. @EnableDiscoveryClient
  7. @SpringBootApplication
  8. public class DemoConsumerApplication {
  9. public static void main(String[] args) {
  10. SpringApplication.run(DemoConsumerApplication.class, args);
  11. }
  12. }
  • 参照Nacos中注册的服务名,在服务调用者程序中映射微服务接口, 并通过@FeignClient调用微服务,同时定义服务熔断时如何处理(fallback)

  1. /**
  2. * 映射商品微服务接口
  3. */
  4. @Component
  5. // 增加服务容错处理,指定服务熔断时处理的类名
  6. @FeignClient(value="goods-service",fallback =FallBackService.class )
  7. public interface GoodService {
  8. @GetMapping(value="/api/goods")
  9. List<GoodsDTO> getGoods();
  10. }
  11. /**
  12. * 服务熔断处理:返回空值
  13. */
  14. @Component
  15. public class FallBackService implements GoodService {
  16. private final static Logger logger= LoggerFactory.getLogger(FallBackService.class) ;
  17. @Override
  18. public List<GoodsDTO> getGoods() {
  19. logger.info("服务已熔断...");
  20. return new ArrayList<>();
  21. }
  22. }
  • 服务调用者调用程序无需变化
  1. /**
  2. * 用户消费者--调用nacos服务中心的商品服务,并对外提供RestFul接口测试
  3. */
  4. @RestController
  5. @RequestMapping("user/")
  6. public class UserConsumer {
  7. // 注入商品微服务接品
  8. @Autowired
  9. private GoodService goodService;
  10. @GetMapping("/goods")
  11. public User getUserGoods() {
  12. User user = new User();
  13. // 通过GoodsService接口调用商品微服务
  14. try {
  15. List<GoodsDTO> goods = goodService.getGoods();
  16. user.setName("jack");
  17. user.setGoods(goods);
  18. } catch (Exception e){
  19. throw new RuntimeException(e.getMessage());
  20. }
  21. return user;
  22. }
  23. }
  • 接下来启动微服务调用者,通过HttpClient工具进行测试,调用正常

  • 进入到Sentinel控制台,同样可以看到消费者的Api接口

4.3.1 对服务调用者中的服务提供方进行流量控制

  • 对Sentinel控制台中服务的资源增加流量控制规则,在FeignClient中,Sentinel为Feign调用生成了资源名策略定义,定义规则为 [httpmethod :protocol://requesturl](比如 GET:http://goods-service/api/goods)

  • 为便于测试,故意将QPS的单机阈值设为0



  • 使用HttpClient工具再次测试,由于我们在流量控制规则中已对QPS做了限制,服务调用请求已无法通过,故触发fallback,返回空值。

  • 服务调用者日志信息提示服务已熔断..

4.4 Sentinel实践小结

  • Sentinel与Hystrix相比,更加轻量级:Sentinel对主流框架提供适配的 API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
  • Sentinel 提供了更加多样化的流量控制,熔断降级和系统负载保护手段。
  • Sentine具备完善的实时监控和控制台。

Spring Cloud Alibaba微服务生态的基础实践的更多相关文章

  1. Spring Cloud Alibaba | 微服务分布式事务之Seata

    Spring Cloud Alibaba | 微服务分布式事务之Seata 本篇实战所使用Spring有关版本: SpringBoot:2.1.7.RELEASE Spring Cloud:Green ...

  2. Spring Cloud Alibaba | Sentinel: 服务限流基础篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...

  3. Spring Cloud Alibaba微服务一站式解决方案-开篇v2.2.1.RELEASE

    学习路线 **本人博客网站 **IT小神 www.itxiaoshen.com 生态概述 架构演进 什么是微服务 https://martinfowler.com/microservices/ Mic ...

  4. Spring Cloud Alibaba微服务架构入门最容易理解篇

    微服务架构介绍 Spring Cloud Alibaba推荐的微服务生态架构基于分层架构实现如下: 接入层:最外层为LVS+Keepalived,可承受几十万级高并发流量洪峰,然后再通过内层的ngin ...

  5. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流高级篇 1. 熔断降级 1.1 降级策略 2. 热点参数限流 2.1 项目依赖 2.2 热点参数规则 3. 系统自适应限 ...

  6. Spring Cloud构建微服务架构(一)服务注册与发现

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...

  7. Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】

    转载:http://blog.didispace.com/spring-cloud-starter-dalston-6-2/ 原创  2017-08-26  翟永超  Spring Cloud 被围观 ...

  8. Spring Cloud构建微服务架构(五)服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: 我们使用Spring Cloud Netflix中的Eureka实现了服务 ...

  9. Spring Cloud构建微服务架构 - 服务网关

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...

随机推荐

  1. SpringBoot中Mybatis打印sql日志

    application.yml中加上 # springBoot+Mybatis 控制台打印SQL语句 (方式一) logging: level: com.zoctan.api.mapper : deb ...

  2. goalng包和命令工具

    1. 包简介 任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性.这种模块化的特性允 ...

  3. Spark on Yarn运行时加载的jar包

    spark on yarn运行时会加载的jar包有如下: spark-submit中指定的--jars $SPARK_HOME/jars下的jar包 yarn提供的jar包 spark-submit通 ...

  4. Linux bpytop工具介绍

    一.工具简介: Easy to use, with a game inspired menu system. Full mouse support, all buttons with a highli ...

  5. 如何检查nofollow超链接属性是否有效

    http://www.wocaoseo.com/thread-88-1-1.html     nofollow 标签的重要性就不用阐述了,在这里武汉SEO与大家分享一些nofollow 标签的基本知识 ...

  6. 解决git add README.md 时报错 fatal: pathspec 'README.md' did not match any files

    解决办法一: 直接在远程仓库创建然后在本地$ git pull origin master 解决办法二: 换成$ touch README.md在本地创建修改后再commit push上去

  7. 微信小程序如何快速开通流量主

    1.先开发小程序,小程序需要有亮点,毕竟新颖(这样别人才更好去点击查看) 2.条件是独立访客(UV)不低于1000,1000人说多不多,说少也不少,因为小程序是没有链接的,是不可以进行一个流量刷取的, ...

  8. Flink run提交参数

    折腾了好几天,终于搞定了Flink run提交参数,记录一下. 背景: 之前一直报错,akka,AskTimeoutException,尝试添加akka.ask.timeout=120000s, 依然 ...

  9. 整理最全的Android开发工程师面试题,面试题详解。java、Android程序员

    1.    请描述下Activity的生命周期. 必调用的三个方法:onCreate()--> onStart() --> onResume(),用AAA表示 (1)父Activity启动 ...

  10. Asp.Net Core3.x中使用Cookie

    在Asp.Net中使用Cookie相对容易使用,Request和Response对象都提供了Cookies集合,要记住是从Response中存储,从Request中读取相应的cookie.Asp.Ne ...