首页 文章 精选 留言 我的

精选列表

搜索[Service Mesh],共10000篇文章
优秀的个人博客,低调大师

Knative Service 之流量灰度和版本管理

本篇主要介绍 Knative Serving 的流量灰度,通过一个 rest-api 的例子演示如何创建不同的 Revision、如何在不同的 Revision 之间按照流量比例灰度。 部署 rest-api v1 代码 测试之前我们需要写一段 rest-api 的代码,并且还要能够区分不同的版本。下面我基于官方的例子进行了修改,为了使用方便去掉了 github.com/gorilla/mux 依赖,直接使用 Golang 系统包 net/http 替代。这段代码可以通过 RESOURCE 环境变量来区分不同的版本。 package main import ( "fmt" "io/ioutil" "log" "net/http" "net/url" "os" "flag"

优秀的个人博客,低调大师

Android平台调用Web Service:螺纹的引入

文字连接 剩下的问题 MainActivity的onCreate方法中假设没有有这段代码: // 强制在UI线程中操作 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() .build()); 会报错误例如以下: FATAL EXCEPTION:main java.lang.NullPointerException atcom.example.demoservice.MainActivity.getRemoteInfo(MainActivity.java:91) atcom.example.demoservice.MainActivity$1.onClick(MainActivity.java:51) 这是由于android 3.0+以上 已经不建议在activity中加入耗时操作,要界面和数据脱离。4.0以上的通信都必须放到线程里去做,不能在UI线程。解决的方法是另起线程。假设一定要想在UI线程操作,就须要加入如上代码。 显然这样做是不可取的,由于通信消耗时间长,可能会让用户傻傻的等待。那么接下来就通过引入线程来解决问题。 通过Runnable接口和Thread类创建线程 我们能够用Runnable接口和Thread类创建线程。从而舍弃强制使用UI主线程的方式,代码例如以下(同一时候对代码进行了整理,把nameSpace等变量抽出来) public classMainActivity extends Activity { public static final String TAG ="webService_pj"; private EditText phoneSecEditText; private TextView resultView; private Button queryButton; @Override public void onCreate(BundlesavedInstanceState) { // StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder() // .detectDiskReads().detectDiskWrites().detectNetwork() // .penaltyLog().build()); // // StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder() // .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath() // .build()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); phoneSecEditText = (EditText)findViewById(R.id.phone_sec); resultView = (TextView)findViewById(R.id.result_text); queryButton = (Button)findViewById(R.id.query_btn); queryButton.setOnClickListener(newOnClickListener() { @Override public void onClick(View v) { Log.i(TAG,"MainActivity线程ID:"+Thread.currentThread().getId()); // 手机号码(段) String phoneSec =phoneSecEditText.getText().toString().trim(); // 简单推断用户输入的手机号码(段)是否合法 if("".equals(phoneSec) || phoneSec.length() < 7) { // 给出错误提示 phoneSecEditText.setError("您输入的手机号码(段)有误!"); phoneSecEditText.requestFocus(); // 将显示查询结果的TextView清空 resultView.setText(""); return; } // 命名空间 String nameSpace = "http://WebXml.com.cn/"; // 调用的方法名称 String methodName ="getMobileCodeInfo"; // EndPoint String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"; // SOAP Action String soapAction = "http://WebXml.com.cn/getMobileCodeInfo"; // method params and values ArrayList<String> params= new ArrayList<String>(); ArrayList<Object> vals =new ArrayList<Object>(); params.add("mobileCode"); params.add("userId"); vals.add(phoneSec); vals.add(""); // 通过Runnable接口和Thread类 创建线程调用WebService newMyThread(nameSpace,methodName,endPoint,soapAction, params,vals).start(); //将WebService返回的结果显示在TextView中 resultView.setText(getResult()); } }); } //通过Runnable接口和Thread类,得到线程返回值 privateString result; publicString getResult(){ returnresult; } private class MyThread extends Thread { private String nameSpace; private String methodName; private String endPoint; private String soapAction; private ArrayList<String> params; private ArrayList<Object> vals; public MyThread(String nameSpace, String methodName, StringendPoint, String soapAction, ArrayList<String> params,ArrayList<Object> vals){ this.nameSpace = nameSpace; this.methodName = methodName; this.endPoint = endPoint; this.soapAction = soapAction; this.params = params; this.vals = vals; } @Override publicvoid run() { Log.i(TAG,"MyService线程ID:"+Thread.currentThread().getId()); result= getRemoteInfo(nameSpace, methodName, endPoint, soapAction,params,vals); } } /** *@MethodName : getRemoteInfo *@Description : 调用远程webservice方法 * @param nameSpace * @param methodName * @param endPoint * @param soapAction * @param params * @param vals * @return */ public String getRemoteInfo(StringnameSpace, String methodName, StringendPoint, String soapAction, ArrayList<String> params, ArrayList<Object>vals) { // 指定WebService的命名空间和调用的方法名 SoapObject rpc = newSoapObject(nameSpace, methodName); //设置需调用WebService接口须要传入的两个參数mobileCode、userId for (int i = 0; i < params.size();i++) { rpc.addProperty(params.get(i),vals.get(i)); } //生成调用WebService方法的SOAP请求信息,并指定SOAP的版本号 SoapSerializationEnvelope envelope =new SoapSerializationEnvelope(SoapEnvelope.VER10); envelope.bodyOut = rpc; // 设置是否调用的是dotNet开发的WebService // envelope.dotNet = true; // 等价于envelope.bodyOut = rpc; envelope.setOutputSoapObject(rpc); HttpTransportSE transport = newHttpTransportSE(endPoint); try { // 调用WebService transport.call(soapAction,envelope); } catch (Exception e) { e.printStackTrace(); } // 获取返回的数据 SoapObject object = (SoapObject)envelope.bodyIn; String result = ""; if (object != null) { // 获取返回的结果 result =object.getProperty(0).toString(); } return result; } } 通过线程进行通信。得到相同结果 出现新的问题 能够发现,运行线程中须要在线程中返回一个值,通过在run()中保存返回值。存储返回值的变量应该是MainActivity的成员变量。然后在主线程中用一个get方法取得该值。 可是run何时完毕是未知的。非常可能当第一次点击button后。依旧看不到结果,直到第二次或者很多其它才看到,所以我们须要一定的机制来保证。 而在Java se5就開始用Callable和Future来管理多线程了。能够解决问题。接下文。。 。 源代码下载 http://download.csdn.net/detail/tcl_6666/7365341 版权声明:本文博客原创文章,博客,未经同意,不得转载。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4732231.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

[Android UI] Service里面启动Activity和Alertdialog

启动Activity源码:(记得要加上Intent.FLAG_ACTIVITY_NEW_TASK) Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setClass(getApplicationContext(),FileBrowserActivity.class); startActivity(intent); 原因:如果一个外部的Activity Context调用startActivity方法,那么,Intent对象必须包含 FLAG_ACTIVITY_NEW_TASK标志,这是因为,待创建的Activity并没有从一个已经存在的Activity启动(任务栈中并没有此Activity),它并没有已经存在的任务,因此它需要被放置在自己独立的任务中(也就是在任务栈中新建一个任务)。 启动AlertDialog源码: AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("是否接受文件?") .setPositiveButton("是", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }).setNegativeButton("否", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); AlertDialog ad = builder.create(); //ad.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); //系统中关机对话框就是这个属性 ad.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); ad.setCanceledOnTouchOutside(false); //点击外面区域不会让dialog消失 ad.show(); 还要加上权限:<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/> 分类: Android UI 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/4097604.html如需转载请自行联系原作者 demoblog

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册