4.SpringCloud 基本架构
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
<packaging>pom</packaging>
3.2 创建子项目
子项目pom.xml中指定父项目
<parent>
<artifactId>springcloud-teach</artifactId>
<groupId>com.luobei</groupId>
<version>1.0</version>
</parent>
父项目pom.xml中指定子项目
<modules>
<module>eureka-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 导入依赖
父项目:
<dependencyManagement><dependencies><!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-openfeign-core</artifactId><version>2.2.6.RELEASE</version></dependency></dependencies></dependencyManagement>
公共模块:
<!--openfeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.6.RELEASE</version>
</dependency>
子项目:
<!--openfeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>
4.2.1.2 编写接口
若接口将会被多个微服务调用则写在commons中
@FeignClient(name="GOODS",path="/goods")
public interface FeignGoodsService {@PutMapping("/updateStock")ResponseResult<List<Goods>> del(@RequestBody List<OrderGoodsVo> 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 {ResponseResult<List<Goods>> 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>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-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、token@Overridepublic 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;charset=utf-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 Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("gateway过滤器");//获取uriServerHttpRequest request = exchange.getRequest();String path = request.getURI().getPath();log.info(path.toString());if(requireLogin(path)){//需要登录List<String> 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();ResponseResult<Boolean> 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;charset=utf-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;}
}
相关文章:
4.SpringCloud 基本架构
1.SpringCloud概述 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,…...
springboot后端返回图片,vue前端接收并显示的解决方案
后端图片数据返回 后端通过二进制流的形式,写入response中 controller层 /*** 获取签到二维码*/GetMapping("/sign-up-pict")public void signUpPict(Long id, Long semId, HttpServletResponse response) throws NoSuchAlgorithmException {signUpServ…...
算法|Day46 动态规划14
LeetCode 1143- 最长公共子序列 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目描述:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ÿ…...
宠物小程序开发攻略:五分钟教你打造宠物店小程序
随着互联网技术的发展和智能手机的普及,小程序成为了各行各业的新宠。宠物服务行业也不例外,宠物店通过搭建小程序,可以实现线上线下的结合,提供更便捷的服务和更优质的用户体验。那么,宠物服务小程序的制作流程是怎样…...
open suse 15.5(任意版本) 使用阿里云的repo
一、shell suse 的包管理工具叫 zypper. zypper addrepo -f http://mirrors.aliyun.com/opensuse/distribution/leap/15.5/repo/oss/ openSUSE-15.5-Oss zypper addrepo -f http://mirrors.aliyun.com/opensuse/distribution/leap/15.5/repo/non-oss/ openSUSE-15.5-Non-Oss …...
第一篇:编写 Hello World 程序
编写 Hello World 程序 Hello World 程序就是让应用程序显示 Hello World 字符串。这是最简单的应用,但却包含了一个应用程序的基本要素,所以一般使用它来演示程序的创建过程。本章要讲的就是在Qt Creator 中创建一个图形用户界面的项目,从而…...
python 打印沁园春 雪 居中对齐 文本对齐
以下是python 中使用 DebugInfo 模块居中对齐打印《沁园春・雪》的效果 引入模块 pip install DebugInfopython代码 # -*- coding:UTF-8 -*-# region 引入必要依赖 from DebugInfo.DebugInfo import * # endregion诗文 沁园春 雪 作者: 毛主席 北国风光,千里冰封…...
在 IDEA 中使用 Git开发 图文教程
在 IDEA 中使用 Git开发 图文教程 一、连接远程仓库二、IDEA利用Git进行开发操作三、分支操作3.1 新建分支3.2 切换分支3.3 删除分支3.4 比较分支3.5 合并分支 四、常用快捷键 一、连接远程仓库 一、打开IDEA,进入目录:File ->New ->Project from…...
NodeJs导出PDF
(优于别人,并不高贵,真正的高贵应该是优于过去的自己。——海明威) 场景 根据订单参数生成账单PDF 结果 示例代码 /* eslint-disable no-unused-vars */ /* eslint-disable no-undef */ /* eslint-disable complexity */ const…...
内核编译机制
inux内核的编译主要过程:配置、编译、安装。 配置主要由Kconfig提供图形界面完成 编译主要基于Kbuild编译系统,执行make完成编译 安装主要也是基于Kbuild提供的脚本,然后执行make完成安装 Kconfig Kconfig用于内核的配置,mak…...
机器人TF坐标系变换与一些可视化工具的应用
TF坐标在ROS中是一个非常重要的概念,因为机器人在做日常操作任务的时候,对于其所在位置和朝向是需要时刻知道的,而机器人是由很多节点组成的协同任务,对于每个部件,我们需要知道它的位姿(位置和朝向),这使得…...
c++ 友元 运算符重载详解
友元 c是面向对象的,目的之一:封装 封装: 优点之一,就是安全。 缺点:在某些特殊的场合,不是很方便。 华为与IBM 40亿的咨询故事 IBM需要对华为各级部门做深度咨询分析, 为了提高咨询效率&a…...
DataWhale 机器学习夏令营第三期
DataWhale 机器学习夏令营第二期 学习记录一 (2023.08.18)1.赛题理解2.缺失值分析3. 简单特征提取4. 数据可视化离散变量离散变量分布分析 DataWhale 机器学习夏令营第三期 ——用户新增预测挑战赛 学习记录一 (2023.08.18) 已跑通baseline,换为lightgbm基线&#…...
回归预测 | MATLAB实现BES-LSSVM秃鹰搜索算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图)
回归预测 | MATLAB实现BES-LSSVM秃鹰搜索算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现BES-LSSVM秃鹰搜索算法优化最小二乘支持向量机多输入单输出回归预测(多指标,多图&a…...
python分析实战(4)--获取某音热榜
1. 分析需求 打开某音热搜,选择需要获取的热榜如图 查找包含热搜内容的接口返回如图 将url地址保存 2. 开发 定义请求头 headers {Cookie: 自己的cookie,Accept: application/json, text/plain, */*,Accept-Encoding: gzip, deflate,Host: www.douyin.com,…...
Java根据List集合中的一个字段对集合进行去重
利用HashSet 创建了一个HashSet用于存储唯一的字段值,并创建了一个新的列表uniqueList用于存储去重后的对象。遍历原始列表时,如果字段值未在HashSet中出现过,则将其添加到HashSet和uniqueList中。 List<Person> originalList new Ar…...
(AtCoder Beginner Contest 315)
A.直接模拟即可 import random import sys import os import math from collections import Counter, defaultdict, deque from functools import lru_cache, reduce from itertools import accumulate, combinations, permutations from heapq import nsmallest, nlargest, h…...
API 接口选择那个?RESTful、GraphQL、gRPC、WebSocket、Webhook
大家好,我是比特桃。目前我们的生活紧紧地被大量互联网服务所包围,互联网上每天都有数百亿次API调用。API 是两个设备相互通讯的一种方式,人们在手机上每次指尖的悦动,背后都是 API 接口的调用。 本文将列举常见的一些 API 接口&…...
「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg
本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg,方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…...
软考高级架构师下篇-12层次式架构设计理论与实践
目录 1. 考情分析2. 层次式体系结构概述3. 表现层框架设计4. 中间层框架设计5. 数据访问层设计6. 数据架构规划与设计7. 物联网层次架构设计8. 前文回顾1. 考情分析 根据考试大纲,层次式架构设计理论与实践知识点会涉及单选题型(约占2~5分)和案例题(25分),本小时内容偏重于方…...
234. 回文链表
234. 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* L…...
LInux之例行工作
目录 场景 单一执行例行任务 --- at(一次性) 安装 命令详解 语法格式 参数及作用 时间格式 案例 at命令执行过程分析 循环执行的例行性任务--crontab(周期性) crontd服务安装 linux 任务调度的工分类 crontab工作过程…...
C++,从“hello world“开始
一、"hello world" #inclue <iostream>using namespace std;int main() {cout << "hello world" << endl;return 0; } 1.1 #include:预处理标识 1.2 <iostream>:输入输出流类所在头文件 1.2.1 istream&a…...
/root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘+ssh-rsa‘.
文章目录 1、问题2、查看openssh版本3、解决问题4、重新生成密钥5、查看是否可连接工蜂 1、问题 ssh访问工蜂报错: [rootlocalhost .ssh]# ssh -T gitgit.code.tencent.com /root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘ssh-rsa’. 2、查看o…...
mac m1上系统内录内部声音的方法/无需安装Blackhole
总所周知,m1的mac不能录制桌面音频,obsstudio都不行。 最快的解决方法就是下载飞书: 登陆后新建直播/视频会议: 共享的时候选择下面的两个钩上去就好了...
数字人学习目录
数字人学习目录 百度PaddlePaddleHub图像风格迁移模型pp-tinypose模型 PaddleGANPaddleLitePaddleDetectionPP-TinyPose 人体骨骼关键点识别 PaddleSpeechVisualDLPaddleBobo TransformerWav2LibCLIPFFMpeg模型库数据集学习天地PythonJupyter Notebook Unity3DUE 百度Paddle P…...
PHP 房产网站系统Dreamweaver开发mysql数据库web结构php编程计算机网页项目
一、源码特点 PHP 房产网站系统是一套完善的WEB设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 源码 https://download.csdn.net/download/qq_41221322/88233553 论文 https://download…...
0基础入门代码审计-2 Fortify初探
0x01 序言 目前又加入一位新童鞋了,最近将会再加入cs相关的专栏,都是以基础为主,毕竟太复杂的东西,能看懂的人太少。 0x02 准备工具 1、Fortify 2、需要审计的源码 0x03 Fortify的简单使用 1、 1、在开始菜单栏中找到Audit Wo…...
qiiuzhiji4
本篇是从慧与离职后到2023年8月21日这段时间的经历 2023/7/31至2023/8/21 本篇初次写于2023年8月21日 从慧与离职后基本上就是在专心找工作了,但是有在这段时间找工作经历的人都明白,IT行业不复以往了。尤其是对于我这样的普通二本学历的人来说ÿ…...
构建 NodeJS 影院微服务并使用 docker 部署【01/4】
图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站,需要Docker、NodeJS、MongoDB,这样的案例您见过吗?如果对此有兴趣,您就继续往下看吧。 在本系列中,我们将构建一个 NodeJS 微服务,并使用…...
张家口购物网站开发设计/百度游戏
org.springframework.web.servlet.support.RequestContextUtils 在spring-webmvc中, 主要用来获取WebApplicationContext org.springframework.web.context.request.RequestContextHolder 在spring-web中, 主要用来获取当前线程的RequestAttributes对象&…...
怎么知道网站有没有备案/2345网址导航删除办法
React 路由理解: 什么是路由?1: 一个路由就是一个映射关系(key: value);2: key: 为路径, value: 为function 或者component路由的分类:后端路由: 理解为: value是 functuion, 用来处理客户提交的请求。注册路由: router.get(path, (ctx, next)> {});工作过程: 当…...
wordpress 最新版/seo的中文含义是
今天研究了个开源项目,数据库是mysql的,其中的脚本数据需要备份,由于本人的机器时mac pro,而且mac下的数据库连接工具都不怎么好用,就想着如何利用windows下的数据库连接工具使用,并做相关备份,…...
零基础怎么当程序员/昭通网站seo
前提:使用 JS 创建对象的最优办法,是 原型模式。step1: 原型模式的基础使用方式function fn(){}fn.prototype {}var x new fn();x.aaa();缺点:使用 fn.prototype 中的成员时,需要先创建 fn的实例:var x new fn();麻烦,希望不需要每次都实例化。尝试1:…...
深圳好看的网站建设哪家公司好/排名优化工具下载
这里以hibernate4.1.7为例,为hibernate-core.jar添加在myEclipse中直接打开查看功能: 说明:我使用的是myEclipse8.5,不通过版本,从视图到方法,可能都存在差异但是道理和组织形式应该是相同的。 现象&#x…...
wordpress基于谷歌框架/求个没封的网站2022
为什么80%的码农都做不了架构师?>>> boot2docker 默认会自动挂载 /Users 目录,虚拟机在启动的时候会运行 /etc/rc.d/automount-shares 挂载 /Users 目录。 在Mac 上使用Docker,由于使用的是虚拟机,然后Docker 在挂载…...