云服务器内容精选

  • 操作步骤 下载JavaAgent,参考探针下载地址下载apm-javaagent,并将javaagent下载到需要接入 APM 机器的任意目录。 示例命令: curl -O https://xxx/apm-javaagent-x.x.x.tar 执行tar命令解压javaagent。 示例命令: tar -xvf apm-javaagent-x.x.x.tar 修改javaagent中的apm.config配置文件。master.address配置请参见探针接入地址,将AK/SK写入配置文件中,如下图所示。 图3 写入AK/SK 修改java进程启动脚本。 在服务启动脚本的java命令之后,配置apm-javaagent.jar包所在路径,并指定java进程的组件名。 添加-javaagent参数示例: java -javaagent:/xxx/apm-javaagent/apm-javaagent.jar=appName={appName} 当企业业务很多的情况下,也支持更为复杂一些的配置,添加-javaagent参数的复杂模式如: java -javaagent:/xxx/apm-javaagent/apm-javaagent.jar=appName=myApp,env=myEnv,envTag=myTag,business=myBusiness,subBusiness=mySub 上述参数属于APM内置的CMDB信息,具体详情见CMDB管理章节。 由于历史原因,APM启动参数设置的元数据,跟CMDB概念有一些冲突,这里进行说明。 启动参数一般会设置 -javaagent:D:\javaagent-package\apm-javaagent\apm-javaagent.jar=appName=xxx,env=yyy,business=zzz,subBusiness=sss,envTag=xxx,在这里appName代表组件,business代表应用,subBusiness代表子应用,envTag代表环境标签。 如果没有在web界面对business参数进行设置,启动javaagent时系统就会报错;其他参数如果没有设置,在启动javaagent时会自动创建出来,包括子应用、组件、环境及环境标签等。 同一个应用下,组件名称不能重复。 重新部署应用。
  • 功能说明 OBS客户端支持通过访问密钥、请求方法类型、请求参数等信息生成一个在Query参数中携带鉴权信息的URL,可将该URL提供给其他用户进行临时访问。在生成URL时,您需要指定URL的有效期来限制访客用户的访问时长。 如果您想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对象),则需要生成带对应请求的URL后(例如使用生成PUT请求的URL上传对象),将该URL提供给其他用户。 如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题: 未配置跨域,需要在控制台配置CORS规则,请参考配置桶允许跨域请求。 签名计算问题,请参考URL中携带签名排查签名参数是否正确;比如上传对象功能,后端将Content-Type参与计算签名生成授权URL,但是前端使用授权URL时没有设置Content-Type字段或者传入错误的值,此时会出现跨域错误。解决方案为:Content-Type字段前后端保持一致。 不支持通过 CDN加速 后的 域名 生成临时访问URL。
  • 升级SDK后报错StackOverflowError问题 1 2 3 4 5 6 7 8 9 Caused by: java.lang.StackOverflowError at sun.misc.URLClassPath.getResource(URLClassPath.java:211) ~[?:1.8.0_91] at java.net.URLClassLoader$1.run(URLClassLoader.java:365) ~[?:1.8.0_91] at java.net.URLClassLoader$1.run(URLClassLoader.java:362) ~[?:1.8.0_91] at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_91] at java.net.URLClassLoader.findClass(URLClassLoader.java:361) ~[?:1.8.0_91] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_91] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_91] at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1806)
  • 升级SDK后okhttp报错问题 1 2 3 4 5 6 Exception in thread "main" java.lang.NoSuchMethodError: 'okhttp3.RequestBody okhttp3.RequestBody.create(java.lang.String, okhttp3.MediaType)' at com.obs.services.internal.RestConnectionService.createRequestBuilder(RestConnectionService.java:157) at com.obs.services.internal.RestConnectionService.setupConnection(RestConnectionService.java:148) at com.obs.services.internal.RestConnectionService.setupConnection(RestConnectionService.java:124) at com.obs.services.internal.RestStorageService.performRequest(RestStorageService.java:395) at com.obs.services.internal.RestStorageService.performRequest(RestStorageService.java:388)
  • 报错SSL peer shut down incorrectly 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 javax.net.ssl.SSLException: SSL peer shut down incorrectly at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:596) at sun.security.ssl.InputRecord.read(InputRecord.java:532) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975) at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:933) at sun.security.ssl.AppInputStream.read(AppInputStream.java:105) at obs.shaded.okio.Okio$2.read(Okio.java:140) at obs.shaded.okio.AsyncTimeout$2.read(AsyncTimeout.java:237) at obs.shaded.okio.RealBufferedSource.read(RealBufferedSource.java:51) at obs.shaded.okhttp3.internal.http1.Http1ExchangeCodec$AbstractSource.read(Http1ExchangeCodec.java:389) at obs.shaded.okhttp3.internal.http1.Http1ExchangeCodec$FixedLengthSource.read(Http1ExchangeCodec.java:427) at obs.shaded.okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.java:286) at obs.shaded.okio.RealBufferedSource$1.read(RealBufferedSource.java:447) at java.util.zip.InflaterInputStream.fill(InflaterInputStream.java:238) at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158) at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:117) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:161) at java.io.BufferedReader.readLine(BufferedReader.java:324) at java.io.BufferedReader.readLine(BufferedReader.java:389)
  • NullPointException空指针异常 1 2 3 Exception in thread "main" java.lang.NullPointerException at com.obs.services.internal.RestStorageService.isCname(RestStorageService.java:1213) at com.obs.services.ObsClient.doActionWithResult(ObsClient.java:2805)
  • 读写超时 1 2 3 4 5 6 HTTP Code: 408 Error Code:RequestTimeOut Caused by: java.net.SocketTimeoutException: timeout at okio.Okio$4.newTimeoutException(Okio.java:232) at okio.AsyncTimeout.exit(AsyncTimeout.java:285) at okio.AsyncTimeout$2.read(AsyncTimeout.java:241) 此类错误一般有两种原因: 客户端到OBS服务端的网络时延过大,解决方法:检查客户端到OBS服务端的网络健康状况; 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况。
  • UnknownHostException域名无法解析异常 1 2 3 4 Caused by: java.net.UnknownHostException: bucketname.unknowndomain.com at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:901) at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1293) 此类错误一般有两种原因: 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确; DNS无法解析OBS服务域名,解决方法:联系OBS运维团队。
  • 连接超时 1 2 3 4 HTTP Code: 408 Caused by: java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) 此类错误一般有三种原因: 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确; 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况; DNS解析出的OBS服务域名无法访问,解决方法:联系OBS运维团队。
  • SignatureDoesNotMatch签名不匹配 1 2 HTTP Code: 403 Error Code: SignatureDoesNotMatch 此类错误一般有三种原因: 初始化ObsClient时传入的SK有误,解决方法:检查SK,确保正确; 旧版本OBS Java SDK的BUG,解决方法:升级SDK到最新版本; OBS Java SDK 2.1.x版本与其依赖库Apache HttpClient的兼容性问题,解决方法:使用固定版本的依赖库,httpcore-4.4.4和httpclient-4.5.3。
  • ObsException中无法获取错误码 此类错误一般有两种原因: 调用ObsClient.getBucketMetadata或ObsClient.getObjectMetadata报错,此种场景下由于后台使用的是HEAD请求,服务端不会返回错误码,解决方法:使用ObsException.getResponseCode获取HTTP状态码,根据状态码分析可能原因,如403一般代表无权限访问,404一般代表桶或对象不存在;如无法定位原因,可从ObsException中获取OBS服务端请求ID后联系OBS运维团队; 初始化ObsClient时传入的Endpoint通过DNS解析后的IP不是有效的OBS服务端,解决方法:检查Endpoint配置是否正确,如Endpoint确认无误,联系OBS运维团队。
  • 如果桶内已存在同名对象,如何判定覆盖上传成功?(Java SDK) 上传完成后,您可以调用ObsClient.getObjectMetadata接口获取目标对象大小和最后修改时间,再与数据源进行比较: 如果两者大小一致且目标对象的最后修改时间晚于数据源的最后修改时间则表明上传成功,否则上传失败。 ObsClient.getObjectMetadata接口的使用可参见18.4-获取对象元数据。 父主题: 常见问题(Java SDK)
  • 代码示例 本示例用于指定位置修改examplebucket并行文件系统中objectname对象的内容。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.ModifyObjectRequest; import com.obs.services.model.ModifyObjectResult; import java.io.ByteArrayInputStream; public class ModifyObject001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("AC CES S_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { // 第一次上传 ModifyObjectRequest request = new ModifyObjectRequest(); request.setBucketName("examplebucket"); request.setObjectKey("objectname"); request.setPosition(0); request.setInput(new ByteArrayInputStream("HELLO OBS FIRST".getBytes())); ModifyObjectResult result = obsClient.modifyObject(request); // 第二次修改写 request.setPosition(0); request.setInput(new ByteArrayInputStream("hello obs second".getBytes())); result = obsClient.modifyObject(request); System.out.println("modifyObject successfully"); System.out.println("HTTP Code: " + result.getStatusCode()); } catch (ObsException e) { System.out.println("modifyObject failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code:" + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); e.printStackTrace(); } catch (Exception e) { System.out.println("modifyObject failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 接口约束 您必须是并行文件系统拥有者或拥有修改写对象的权限,才能修改写对象。建议使用 IAM 或策略进行授权,如果使用IAM则需授予obs:bucket:PutObject权限,如果使用策略则需授予PutObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。 OBS支持的region以及region与endPoint的对应关系,详细信息请参见地区与终端节点。 目前接口仅在并行文件系统支持,普通对象并行文件系统不支持,如何创建并行文件系统请参考创建并行文件系统(Java SDK)。
  • 请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 request ModifyObjectRequest 必选 参数解释: 修改写对象请求参数,详见ModifyObjectRequest。 表2 ModifyObjectRequest 参数名称 参数类型 是否可选 描述 bucketName String 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 objectKey String 必选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 position long 必选 参数解释: 修改写操作的位置。 取值范围: 不小于0的长整型。单位:字节。 默认取值: 无 input InputStream 可选 参数解释: 待上传对象的数据流。 默认取值: 无 file File 可选 参数解释: 待上传的本地文件。 默认取值: 无 encodeHeaders boolean 可选 参数解释: 是否开启OBS对请求头域的自动编码。 由于HTTP编码规范限制,无法发送非ASCII码字符,SDK会在发送请求时对您头域中的中文汉字进行url编码,发送编码后数据。如您设置的值content-disposition为attachment; filename="中文.txt",则对象元数据中存储的信息为attachment; filename="%E4%B8%AD%E6%96%87.txt"。使用浏览器访问时浏览器将会自动解码。 取值范围: true:启用SDK编码。 false:不启用SDK编码。 默认取值: true