每特教育蚂蚁课堂-第六期微服务架构gateway源码深度分析-第六次_第1页
每特教育蚂蚁课堂-第六期微服务架构gateway源码深度分析-第六次_第2页
每特教育蚂蚁课堂-第六期微服务架构gateway源码深度分析-第六次_第3页
每特教育蚂蚁课堂-第六期微服务架构gateway源码深度分析-第六次_第4页
每特教育蚂蚁课堂-第六期微服务架构gateway源码深度分析-第六次_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

每特教育独创SpringCloudAlibaba课程说SpringCloudAlibaba|蚂蚁课堂该课程主要讲解SpringCloudAlibaba组件Nacos(服务与发现和分布OSS、AlibabaCloudSchedulerX课程主讲老师“97后架构师-余胜军” 解的话、可以在蚂蚁课堂中学习SpringBoot蚂蚁课堂SpringBoot基础内容: 需要大家想学习到的分布式/微服务相关内容SpringCloudAlibaba微服务架构演变过传统的架构,也就是为单点应用,也就是大家在早期所学习的JavaEE知识SSH或者SSM架分布式架构模式是基于传统的架构模式演变过来,将传统的单点项目根据业务模块实现拆SOA抽取成一个共同的服务,提供给其他的服务接口实现调用、服务与服务之间通讯采用rpcSOAXMLJSONXML。SOAWebServiceESBSOAPESBIDEAWebServicepublicclassUserServicepublicStringgetUser(Longid)return"mayikt用户;}publicstaticvoidmain(String[]args)",newSystem.out.println("服务发布成功}}wsdlwsdlWebServicepublicpublicclassWebServiceClientpublicstaticvoidmain(String[]args)throwsServiceException,RemoteException{UserServiceServiceLocatoruserServiceServiceLocator=newUserServiceServiceLocator();UserServiceuserService=userServiceServiceLocator.getUserServicePort();Stringresult=userService.getUser(10L);System.out.println("result:"+result);}}微服务架构产生的原微服微服务架构模式是从SOA架构模式演变过来,比SOA架构模式粒度更加精细,让专业的人服务与服务通讯协议采用Http协议,使用restful风格API形式来进行通讯,格jsonhttphttp微服务架构与SOA架构的不SOASOASOAESBhttp+json(restful)SOA微服务架构会产生那些问 分布式服务中心eureka、Zookeeper、consule、nacos等。Zipkin为什么我们要使用SpringCloudSpringCloudConfigSpringCloudNetflix组件Zuul:网关组件,提供智能路由、过滤等功能SpringCloudGatewaySpringCloudLoadbalancerSpringCloudr4j(Resilience4J)SpringCloudAlibabaNacos服务SpringCloudAlibabaNacosSpringCloudAlibabaSentinelSpringCloudAlibabaSeataAlibabaCloudOSS阿里云AlibabaCloudSchedulerXAlibabaCloudSMS分布式系为什么AlibabaSpringCloud组服务与发现在RPC调用过程中,服务与服务之间依赖关系非常大,服务Url地址管理非常复杂,所服务中心的概中心:我们的服务到我们中心,key为服务名称、value为该服务调用地址,该类型为集合类型。Eureka、consul、zookeeper、nacos服务:我们生产者项目启动的时候,会将当前服务自己的信息地址 中心服务发现:消费者从我们的中心上获取生产者调用的地址(集合,在使用负载均衡的策略获取集群中某个地址实现本地rpc调用。服务:将当前服务地址到NacosNacos可以实现分布式服务与发现/分布式配置中心框架。官网的介绍:https Nacos具体安装地址 ' NacosMaven<artifactId>spring-boot-starter-<!--springboot整合web组件<artifactId>spring-boot-starter-<artifactId>spring-cloud-starter-alibaba-nacos-会员服务(生产者服务接publicclassMemberService{privateStringserverPort;会员服务提供的接*@param@RequestMappublicStringgetUser(IntegeruserId)return"每特教育, :"+}}配置文###服 地server-addr:name:mayikt-port:8081订单服务(消费者订单调用会员服publicclassOrderServiceprivateRestTemplaterestTemplate;privateDiscoveryClientdiscoveryClient; oadBalancer订单调用会员服* publicStringorderToMember() // 中心上获取 服务列List<ServiceInstance>serviceInstanceList=discoveryClient.getInstances("mayikt-ServiceInstanceserviceInstance=URIrpcMemberUrl= //使用本地rest形式实现rpc调Stringresult=restTemplate.getForObject(rpcMemberUrl+"/getUser", return订单调用会员获取结果 publicStringorderToMember()// 中心上获取 服务列List<ServiceInstance>serviceInstanceList=discoveryClient.getInstances("mayikt-member");ServiceInstanceserviceInstance=loadBalancer.getSingleAddres(serviceInstanceList);URIrpcMemberUrl=//使用本地rest形式实现rpc调Stringresult=restTemplate.getForObject(rpcMemberUrl+"/getUser",return订单调用会员获取结果}}负载均衡算publicpublicinterfaceLoadBalancer根据多个不同的地址返回单个调用rpc地*@paramServiceInstancegetSingleAddres(List<ServiceInstance>}publicclassRotationLoadBalancerimplementsLoadBalancerprivateAtomicIntegeratomicInteger=newintindex=atomicInteger.incrementAndGet()%2;ServiceInstanceserviceInstance=serviceInstances.get(index);returnserviceInstance;}}Nacos与其他对比分NacosEurekaNacosZookeeperNacos的集群部署Nacos的数据持久化NacosEurekaEurekaZookeeper客户端负载均衡器SpringCloud在SpringCloudRibbonSpringCloudRibbon。publicRestTemplaterestTemplate(){returnnewRestTemplate();}LoadBalancerClient@RequestMap@RequestMappublicObjectloadBalancerClient()returnloadBalancerClient.choose("meitemayikt-}NginxNginxNginxTomcat/Jettyrpc,rest、openfeign、dubbo。OpenFeign客户 Maven<artifactId>spring-boot-starter-<!--springbootweb组件<artifactId>spring-boot-starter-<artifactId>spring-cloud-starter-alibaba-nacos-<artifactId>spring-cloud-starter-publicpublicinterfaceMemberService提供会员接*@paramStringgetUser(@RequestParam("userId")Long}publicpublicclassMemberServiceImplimplementsMemberService{privateStringpublicStringgetUser(LonguserId)return"我是会员服务 为:"+}}publicpublicclassOrderService{privateMemberServiceFeign订单调用会*publicStringorderToMember()Stringresult=memberServiceFeign.getUser(10L);return我是订单服务,调用会员服务接口返回结果result;}}@FeignClient(name="meitemayikt-publicinterfaceMemberServiceFeignextendsMemberService*提供会员**@param*StringgetUser(@RequestParam("userId")Long}}分布式配置中常见的配置中心有携程的、SpringCloudConfig、Nacos轻量级的配置中心等。NacosNaocs平台中创建配置文件名称(默认为服务器名称)-版本###name:meitemayikt-nacos- 地server-addr:enabled:true###server-addr:###group:###file-extension:publicclassNacosController{privateStringpublicStringgetConfig()return}publicstaticvoidmain(String[]args)}}bootstrap.yml.ymlSpringApplicationContextnacos服务器端创建客户端指定版 的基本情况。0.7mysql修改conf/perties文件,增加支持mysql数据源配置(mysql,摘自官网: cluster###ip和端Nginx相关配置###name:meitemayikt-nacos-###nacos地server-addr:enabled:true###server-addr:###group:###file-extension:nacoswindowsstartup.cmdmnacos在linux版本下运行默认是集群版本如果想连接单机版本startup.cmd–mRunninginclusterCAP用性、Partitiontolerance(分区容错性EurekaZookeeper三者都可以实现分布式中心框架Eureka采用AP设计思想实现分布式中心,完全去中心化、每个节点都是相等,采用你中有我、我中有你相互设计思想,只要最后有一台Eureka节点存在整个微服务就可以ApCP如果选择为Ap模式,服务的实例仅支持临时模式,在网络分区的的情况允许服务ZookeeperZAP分为和跟随者角色。我中有你的形式实现中心。,大多数::每次一个新的角色都会增加投票,只要该竞选者有超过半数以上即可选为角色。的设计原理其实就是靠的谁超时时间最短谁就有非常大的概率为角色故障的重新实现己的状态由跟随者变为竞选者角色,会给其他的节点发出的投票,只要该竞选者有超过半数以上即可选为角色。的情况下,开始重置竞选的超时时间,一直到谁的票数最多谁就为。SpringCloud微服务网关是整个微服务API请求的,可以实现日志、权限控制、解决跨域问题、ZuulGatewayGatewaySpringCloudSpringGatewayMaven<artifactId>spring-boot-starter-<artifactId>spring-cloud-starter-applicationport:####服务网关名name:mayikt-####开启以服务id 中心上获取转发地enabled:###路由策###路由-id:####转发/uri:/###匹配规-GatewayNacosMaven<artifactId>spring-boot-starter-<artifactId>spring-cloud-starter-<artifactId>spring-cloud-starter-alibaba-nacos-applicationport:####服务网关名name:mayikt-####开启以服务id 中心上获取转发地enabled:###路由策###路由-id:####转发/uri:/###匹配规-###id:lb负载均衡形式转发uri:lb://mayikt-memberserver-addr:NginxGatewayjavaNginx+LuapublicclassTokenFilterimplementsGlobalFilter{publicpublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){Stringtoken=exchange.getRequest().getQueryParams().getFirst("token");if(token==null||token.isEmpty()){ServerHttpResponseresponse=exchange.getResponse();Stringmsg="tokennotisnull";DataBufferbuffer=return}return}}OATUH2.0appidappsocetaccesstokenhttpsmd5使用微服务网关实现Api认证等、白对我们的接口实现服务的保护、熔断、降级等等。apiswagger使用Nginx或者lvs虚拟vip增加系统的高可privateStringpublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain)//如何获取参数呢Stringtoken=ServerHttpResponseresponse=exchange.getResponse();Stringmsg="tokennotisnull";DataBufferbuffer=return}在请求头中存放serverPortServerHttpRequestrequest=exchange.getRequest().mutate().header("serverPort",serverPort).build();returnchain.filter(exchange.mutate().request(request).build());}Nginxserverserverserver}serverlisten80;location/{}};;`id`int(11)NOTNULLPRIMARYKEY(`id`)publicclassGatewayServiceimplementsApplicationEventPublisherAwareprivateApplicationEventPublisherpublisher;privateRouteDefinitionWriterprivateMayiktGatewayMapperthis.publisher=}publicvoidinitAllRoute()//从数据库查询配置的网关配List<GateWayEntity>gateWayEntities=mayiktGateway.gateWayAll();for(GateWayEntitygw:gateWayEntities){}}publicStringloadRoute(GateWayEntitygateWayEntity){RouteDefinitiondefinition=newRouteDefinition();Map<String,String>predicateParams=newHashMap<>(8);PredicateDefinitionpredicate=newPredicateDefinition();FilterDefinitionfilterDefinition=newFilterDefinition();Map<String,String>filterParams=newHashMap<>(8);//如果配置路由type为0的话则 中心获取服URIuri=uri=uri ponentsBuilder.fromUriString("lb://"+gateWayEntity.getRouteUrl()+}elseuri }//定义的路由唯一的id//路由转发地predicateParams.put("pattern",gateWayEntity.getRoutePattern());//名称是固定的,路径去前缀filterParams.put("_genkey_0","1");this.publisher.publishEvent(newRefreshRoutesEvent(this));return"success";}}publicpublicinterfaceMayiktGatewayMapper@Select("SELECTIDASID,route_idasrouteid,route_nameasrouteName,route_patternasroutePattern\n"",route_typeasrouteType,route_urlasrouteUrl\n""FROMpublicList<GateWayEntity>@Update("updatemayikt_gatewaysetroute_url=#{routeUrl}wherepublicIntegerupdateGateWay(@Param("routeId")StringrouteId,@Param("routeUrl")String}Maven<artifactId>mybatis-spring-boot-mysql依赖<artifactId>mysql-connector-阿里巴巴数据源/mayikt转到到/url:jdbc:mysql://localhost:3306/meite_gateWay?useUnicode=true&characterEncoding=UTF-username:password:iduri、一组谓词+过滤器一起组合而成,如果谓谓词:匹配Http--id:uri:/###匹配规-After=2017-01-20T17:42:47.789-201712017:42MountainTime(Denver)-id-id:uri:/###匹配规- --id:uri:--Weight=group1,-id:weight_lowuri:htt-Weight=group1,idid:uri:lb://meitemayikt-id:uri:lb://mayikt-publicclassCrossOriginFilterimplementsGlobalFilter{publicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){ServerHttpRequestrequest=exchange.getRequest();ServerHttpResponseresponse=exchange.getResponse();HttpHeadersheaders=response.getHeaders();hea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论