当前位置: 首页 > news >正文

湖北网站开发培训浙江大成建设集团有限公司网站

湖北网站开发培训,浙江大成建设集团有限公司网站,wordpress微信捐赠,九一人才网找工作赣州官网1.SpringCloud概述 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具#xff08;例如配置管理#xff0c;服务发现#xff0c;断路器#xff0c;智能路由#xff0c;微代理#xff0c;控制总线#xff0c;一次性令牌#xff0c;全局锁#xff0c;…1.SpringCloud概述 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具例如配置管理服务发现断路器智能路由微代理控制总线一次性令牌全局锁领导选举分布式会话集群状态。用来管理项目 2.注册中心Eureka Spring Cloud Eureka 是对Netflix公司的Eureka的二次封装它实现了服务治理的功能Spring Cloud Eureka提供服务端与客户端服务端即是Eureka服务注册中心客户端完成微服务向Eureka服务的注册与发现。服务端和客户端均采用Java语言编写。 服务器将自己的信息IP、端口号、服务类 提供给注册中心然后每个服务器将所有存在注册中心的注册信息保存一份在自己服务器中从而实现服务器之间的交流 3. 分布式项目搭建 在一个分布式项目中通常会采用父项目和子项目的方式来进行模块化开发和管理。父项目用于管理整个项目的共享依赖和配置而子项目则代表着项目的不同模块或子系统。 3.1 创建父项目 可以删除父项目中的src父项目不需要写代码 在父项目pom.xml中指定打包方式为pom packagingpom/packaging 3.2 创建子项目 子项目pom.xml中指定父项目 parent            artifactIdspringcloud-teach/artifactId            groupIdcom.luobei/groupId            version1.0/version /parent 父项目pom.xml中指定子项目  modules             moduleeureka-server/module /modules 配置yml配置文件 server:port: 8081 spring:application:name: goods #微服务可以根据微服务的名字自动形成集群微服务的名字中不要出现下划线 eureka:client:service-url:defaultZone: http://localhost:8761/eureka/ #向这个接口注册instance:instance-id: goods-8081 #指定当前微服务在注册中心中的id 主启动类上开启 EnableEurekaClient SpringBootApplication EnableEurekaClient public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);} } 3.2.1 创建注册中心 注册中心其实就是一个特殊的子项目除yml配置不同其他与别的子项目一致 server:port: 8761 spring:application:name: eureka-server #微服务可以根据微服务的名字自动形成集群微服务的名字中不要出现下划线 eureka:instance:hostname: localhostclient:register-with-eureka: false #是否将当前服务器注册到注册中心fetch-registry: false #是否将注册列表的信息拉取到本地service-url:defaultZone: http://${eureka.instance.hostname}:${server.port} #注册中心的接口其他微服务器通过该接口进行注册 主启动类上开启EnableEurekaServer EnableEurekaServer SpringBootApplication public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);} } 4.微服务调接口 在微服务架构中服务之间的通信是通过调用接口来实现的。这些接口可以是 RESTful API、gRPC、消息队列等方式实现的。 4.1 RestTemplate仅了解 属于SpringBoot 缺点put、delete请求得不到返回的结果使用、维护不方便 4.2 openfeign OpenFeign 是一个基于 Java 的声明式 HTTP 客户端通常用于微服务架构中不同服务之间的接口调用。它允许开发者通过注解的方式定义接口然后由 OpenFeign 自动生成具体的实现。这样可以简化服务之间的通信让接口调用看起来更像是本地方法调用。 4.2.1 openfeign使用 4.2.1.1 导入依赖 父项目 dependencyManagementdependencies!--openfeign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-openfeign-core/artifactIdversion2.2.6.RELEASE/version/dependency/dependencies/dependencyManagement 公共模块 !--openfeign-- dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactIdversion2.2.6.RELEASE/version /dependency 子项目 !--openfeign-- dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-openfeign-core/artifactId /dependency 4.2.1.2 编写接口 若接口将会被多个微服务调用则写在commons中 FeignClient(nameGOODS,path/goods) public interface FeignGoodsService {PutMapping(/updateStock)ResponseResultListGoods del(RequestBody ListOrderGoodsVo orderGoodsVoList); } FeignClient(name GOODS,path /goods) 中name为被调用微服务的名字path为路径前缀将要调用的接口方法的声明、请求方式全部拷贝过来 4.2.1.3 使用接口 在需要使用接口的微服务的主启动类上扫描feign接口 EnableFeignClients(basePackages com.luobei.commons.service) 然后在需要使用的地方注入就行了 Resource private FeignGoodsService feignGoodsService; Override public OrderVo add(Integer uid, AddOrderVo orderVo) throws OutOffStockException {ResponseResultListGoods del feignGoodsService.del(Arrays.asList(orderGoodsVo));return del; } 4.2.2 openfeign通信日志 openfeign提供了日志打印功能通过配置日志级别对接口的调用情况进行监控和输出 日志级别解释NONE默认的不显示任何日志BASIC仅记录请求方法、URL、响应状态码及执行时间HEADERS除了 BASIC 中定义的信息之外还有请求和响应的头信息FULL除了 HEADERS 中定义的信息之外还有请求和响应的正文及元数据 在调用别的服务器的服务器配置配置类 import feign.Logger; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class LogConfiguration {Beanpublic Logger.Level level(){return Logger.Level.FULL;} } 因为feign日志的输出级别都是debug级别还需要设置service包的日志级别 logging:   level:     com.commons.service: debug 5. Ribbon负载均衡 Ribbon是一个基于HTTP和TCP客户端的负载均衡器默认使用轮询的方式 SpringCloud Ribbon是基于Netfix Ribbon实现的一套客户端负载均衡工具 5.1 Ribbon配置 5.1.1 全局配置 在需要调取多个服务器的服务器中配置配置类 Configuration public class RibbonConfiguration {     Bean     public IRule rule(){         return new RandomRule();     } } 5.1.2 局部配置 注意全局与局部同时存在时ribbon优先使用全局配置 GOODS:   #微服务名字   ribbon:     NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule 5.2 Ribbon超时管理 Ribbon默认请求超时时间为1000毫秒有的时候不够用因此需要重新配置 ribbon:   http:     client:       enabled: true   #开启超时管理   ReadTimeout: 10000  #请求超时   ConnectTimeout: 10000 #连接超时 6.网关Gataway 网关是在分布式系统架构中的一种设计模式用于集中处理和管理请求微服务架构中常用网关技术有Zuul、Spring Cloud Gataway等 6.1 网关的作用 1.路由和负载均衡网关可以根据请求的路径或其他条件将请求路由到不同的后端微服务 2.鉴权和认证网关可以进行用户身份验证、授权以及访问权限的校验 3.监控和日志网关可以记录请求和响应的日志从而监控系统的运行状况、性能和问题 6.2 Zuul Zuul 是 Netflix 开源的一个微服务架构中的边缘服务Edge Service主要用于实现动态路由、负载均衡、鉴权、监控等功能。性能不如Gataway 6.2.1 zuul使用 6.2.1.1 创建zuul微服务 连接父项目。。 导入zuul依赖 dependency         groupIdorg.springframework.cloud/groupId         artifactIdspring-cloud-starter-netflix-zuul/artifactId /dependency 6.2.1.2 配置eureka、路由 server:port: 8500 spring:application:name: zuul #微服务名字很重要微服务可以根据微服务的名字自动形成集群微服务的名字中不要出现下划线 eureka:client:service-url:defaultZone: http://localhost:8761/eureka/ #向这个接口注册instance:instance-id: zuul-8500 #指定当前微服务在注册中心中的id zuul:routes:goods: #路由名用户自定义service-id: GOODS #调用的微服务名path: /goods/** #匹配的路径order:service-id: ORDERpath: /order/** # GOODS: /goods/** # ORDER: /order/** 注意路由有两种配置方式都可 6.2.1.3 zuul主启动类添加注解 SpringBootApplication EnableEurekaClient    //注册 EnableZuulProxy        //开启路由功能 EnableHystrix             //解决504报错问题 public class ZuulApplication {public static void main(String[] args) {SpringApplication.run(ZuulApplication.class, args);} } 注意使用zuul时请求地址应多一个请求的微服务名http://localhost:8500/goods/goods/all 6.2.2 zuul过滤器实现网关限流 zuul过滤器PRE请求到达zuul之前执行可以用来鉴权、判断登录、限流ROUTING 路由时将请求转发给对应的微服务执行 POST路由完毕时微服务返回结果执行ERROR在pre、routing、post出现异常时执行 自定义过滤器使用令牌桶算法实现网关限流 Slf4j Component public class LimitFilter extends ZuulFilter {//创建令牌桶并设置令牌个数private static final RateLimiter RATE_LIMITER RateLimiter.create(1);//指定当前过滤器类型Overridepublic String filterType() {return pre;}//执行顺序可以为负数数字越小越先执行Overridepublic int filterOrder() {return Integer.MIN_VALUE;}//是否要对当前请求进行过滤Overridepublic boolean shouldFilter() {//得到请求的uri判断是否需要登录如果不需要返回false放行否则返回true执行run方法//得到上下文对象RequestContext context RequestContext.getCurrentContext();HttpServletRequest request context.getRequest();log.info(request.getRequestURI());return true;}//执行过滤业务的代码例如校验refreshtoken、tokenOverridepublic Object run() throws ZuulException {//获取令牌if(!RATE_LIMITER.tryAcquire()){//令牌用完至少有100个请求正在处理log.info(令牌不足);//结束本次请求RequestContext context RequestContext.getCurrentContext();context.setSendZuulResponse(false);HttpServletResponse response context.getResponse();try {response.setContentType(text/html;charsetutf-8);response.getWriter().write(系统正忙);} catch (IOException e) {throw new RuntimeException(e);}}return null;} } 6.2.2.1 漏桶算法 简单来说把我们的分布式系统理解成一个上方注水下方漏水的桶固定下方漏水的速率这样就能限制请求的速度当水超过桶流量则丢弃 6.2.2.2 令牌桶算法 每个请求向从桶里获取一个令牌若令牌没有了则拒绝或等待请求处理完成的返回令牌 6.3 Gataway SpringCloud Gateway是基于WebFlux框架实现的而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty因此Gataway的性能比较高效 注意gataway基于webflux因此与spring web 不兼容 6.3.1 使用Gataway 创建Gataway子项目连接父项目 主启动类开启EnableEurekaClient 6.3.1.1 配置配置类 server:port: 8600 spring:application:name: gataway #微服务名字很重要微服务可以根据微服务的名字自动形成集群微服务的名字中不要出现下划线cloud:gateway:routes:- id: goods #路由名任意uri: lb://GOODS #要调用的微服务 lb负载均衡predicates: #匹配的路径- Path/goods/**- id: orderuri: lb://ORDER #要调用的微服务 lb负载均衡predicates: #匹配的路径- Path/order/** eureka:client:service-url:defaultZone: http://localhost:8761/eureka/ #向这个接口注册instance:instance-id: gataway-8600 #指定当前微服务在注册中心中的id 6.3.1.2 配置过滤器 Component Slf4j public class AuthFilter implements GlobalFilter, Ordered {Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info(gateway过滤器);//获取uriServerHttpRequest request exchange.getRequest();String path request.getURI().getPath();log.info(path.toString());if(requireLogin(path)){//需要登录ListString authorization request.getHeaders().get(authorization);if(authorization!null){String token authorization.get(0);log.info(token);return chain.filter(exchange);}else{//没登陆ServerHttpResponse response exchange.getResponse();ResponseResultBoolean responseResult new ResponseResult(ResponseResult.NO_LOGIN,请登录,false);try {//转换成json字符串String json new ObjectMapper().writeValueAsString(responseResult);//转byte数组byte[] data json.getBytes(StandardCharsets.UTF_8);//将数组封装到bufferDataBuffer buffer response.bufferFactory().wrap(data);//设置响应头response.getHeaders().add(Content-Type,application/json;charsetutf-8);//返回数据,并终止return response.writeWith(Mono.just(buffer));} catch (JsonProcessingException e) {e.printStackTrace();}}}//放行return chain.filter(exchange);}Overridepublic int getOrder() {return 0;}private boolean requireLogin(String uri){//将不需要登录就能操作的uri罗列出来String[] uris {/user/login,/user/register,/kill/info,/nginx/port};String[] staticResource {/goods/info/,/goods/find/,/images/};for (String s : uris) {if(uri.equals(s) ){return false;}}for (String s : staticResource) {if(uri.startsWith(s)){return false;}}return true;} }
http://www.dnsts.com.cn/news/15055.html

相关文章:

  • 广州公共资源建设工程交易中心网站网站建设工具哪个好
  • 欧洲手表网站长春自助建站系统
  • 网站标题名字和备案名字深圳市在建项目查询
  • 网站开发程序的移交宁波市建设网
  • 广东省两学一做网站网站怎么自己做
  • 开源 购物网站沧州网站建设哪家专业
  • 自助建站网站哪个好品牌策划案例
  • 中国建筑总公司网站如今做那些网站致富
  • html5网站多少钱wordpress模板极简
  • 株洲网站排名优化价格wordpress模板后门
  • 建设银行德阳分行网站网页设计报告心得
  • 漂亮的php网站源码wordpress网站主题
  • 北京做网站多少钱合理苏州手机网站建设多少钱
  • 烟台市城市建设发展有限公司网站微信小程序开发平台
  • 百度站长平台官网wordpress更改忘记密码样式
  • 通用企业网站模板做网站什么软件好
  • 网站界面设计的要求万网封停慧聪网域名事件
  • 如何360收录网站写字楼装修公司
  • 电影网站建设的核心是阿里云服务器如何做两个网站
  • 如何弄一个自己的网站仿照别人的网站做违法吗
  • 没有服务器怎样做网站网站管理助手 1004
  • 做公司网站的南宁公司软件项目交易网
  • 做商铺最好的网站网站权重能带来什么作用
  • 建设高端网站公司kunkka wordpress
  • 用cms创建自己带数据库的网站中国建筑网官网首页
  • 烟台网站排名系统做购物网站多少钱 知乎
  • 做论坛网站怎么赚钱家装公司图片
  • 防城港网站建设甘肃网络公司网站建设
  • 俄语淘宝网站建设wordpress中的邮箱设置
  • 网站建设 jsp php手机营销型网站建设公司