GIS开发进阶之路(七) Spring Cloud、Lambda表达式、Substring、性能调优(JAVA&C#)

Spring Cloud(Eureka部分&负载均衡部分):

  定义:微服务系统架构的一站式解决方案,基于Spring Boot

(1)服务发现框架:Eureka

基于REST,实现负载均衡和中间层服务器的故障转移

一个比喻:Eureka相当于“中介”,房东(as 服务提供者),顾客(as 服务消费者),房产中介(服务中介)。

服务注册Register:

房东 (提供者 Eureka Client Provider)在中介 (服务器 Eureka Server) 那里登记房屋的信息,比如面积,价格,地段等等(元数据 metaData)。

服务续约Renew:

房东 (提供者 Eureka Client Provider) 定期告诉中介 (服务器 Eureka Server) 我的房子还租(续约) ,中介 (服务器Eureka Server) 收到之后继续保留房屋的信息。

获取注册列表信息 Fetch Registries

租客(消费者 Eureka Client Consumer) 去中介 (服务器 Eureka Server) 那里获取所有的房屋信息列表 (客户端列表 Eureka Client List) ,而且租客为了获取最新的信息会定期向中介 (服务器 Eureka Server) 那里获取并更新本地列表。

服务下线 Cancel

房东 (提供者 Eureka Client Provider) 告诉中介 (服务器 Eureka Server) 我的房子不租了,中介之后就将注册的房屋信息从列表中剔除。

服务剔除 Eviction

房东(提供者 Eureka Client Provider) 会定期联系 中介 (服务器 Eureka Server) 告诉他我的房子还租(续约),如果中介 (服务器 Eureka Server) 长时间没收到提供者的信息,那么中介会将他的房屋信息给下架(服务剔除)。

(2)负载均衡

RestTemplateSpring提供的一个访问Http服务的客户端类,就是微服务之间的调用是使用的 RestTemplate

@Autowired
private RestTemplate restTemplate;
// 这里是提供者A的ip地址,但是如果使用了 Eureka 那么就应该是提供者A的名称
private static final String SERVICE_PROVIDER_A = "http://localhost:8081";
 
@PostMapping("/judge")
public boolean judge(@RequestBody Request request) {
    String url = SERVICE_PROVIDER_A + "/service1";
    return restTemplate.postForObject(url, request, Boolean.class);
}

Eureka 框架中的 注册续约 等,底层都是使用的 RestTemplate1

RibbonNetflix 公司的一个开源的负载均衡 项目,是一个客户端/进程内负载均衡器,运行在消费者端。其工作原理就是 Consumer 端获取到了所有的服务列表之后,在其内部使用负载均衡算法,进行对多个系统的调用。

NignxRibbon 不同的是,它是一种集中式的负载均衡器。在 Nginx 中请求是先进入负载均衡器,而在 Ribbon 中是先在客户端进行负载均衡才进行请求的。

Ribbon 的几种负载均衡算法:

  • RoundRobinRule:轮询策略。Ribbon 默认采用的策略。若经过一轮轮询没有找到可用的 provider,其最多轮询 10 轮。若最终还没有找到,则返回 null。

  • RandomRule: 随机策略,从所有可用的 provider 中随机选择一个。

  • RetryRule: 重试策略。先按照 RoundRobinRule 策略获取 provider,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。

默认轮询算法,并且可以更换默认的负载均衡算法,只需要在配置文件中做出修改就行。

providerName:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

Lambda表达式

(1)定义:

Lambda表达式实际上是一种匿名函数,在Lambda表达式中可以包含语句以及运算等操作。并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。使用Lambda表达式可大大减少代码量,使得代码更加的优美、简洁,更有可观性。

(2)表现形式

表达式形式:(Input Param)=>Expression

(int firstIndex, string str) => str.IndexOf('Hello') > firstIndex;

常用的表达式如下:

var a = studentList.FirstOrDefault(t => t.StudentCode == "10012");//FirstOrDefault返回第一个符合条件的数据,不存在的时候返回Null。
var b = studentList.Count(t => t.StudentName == "李世民");//返回符合条件的实体个数
var c = studentList.FindAll(t => t.StudentName.Contains("中"));//查找所有名字中含有【中】的实体集合
var d = studentList.GroupBy(t => t.ClassCode);//对studentList按照ClassCode分组
var f = studentList.Max(t => t.BirthDay);//返回最大的出生日期。
var e = scoreList.Sum(t => t.ScoreValue);//对所有成绩求和
var g = scoreList.Average(t => t.ScoreValue);//对所有成绩求平均分
var h = studentList.Select(t => t.StudentName).Distinct();//获取所有的学生姓名,并去除重名

 

Substring:

String的一个方法,作用为截取字符串。

//开始截取字符串,本次目的为从第四个字符开始,截取三个字符
string s = new string();
s.Substring(4,3);

 

性能调优:

(1)C#

①查看运行时间的方法:

using System.Diagnostics;
Stopwatch sw = new Stopwatch();
sw.Start();
/*****执行方法*****/
sw.Stop();
TimeSpan timespan = watch.Elapsed;  //获取当前实例测量得出的总时间
Console.WriteLine("打开窗口代码执行时间:{0}(毫秒)", timespan.TotalMilliseconds);  //总毫秒数

②提升效率

避免在循环里创建对象 避免使用全局变量,而尽量在逻辑分支中创建对象 避免装拆箱(即值类型和引用类型的转换) 避免使用反射和动态绑定 使用insert cursor与feature buffer方法代替feature.store() 使用pTable.DeleteSearchedRows(queryFilter)代替IFeature.Delete 使用游标查询方法代替GetRow(i).get_Value(FldIndex) 使用pCursor.UpdateRow(pRow)而不是IFeature和IRow的Store方法

(2)JAVA

①查看运行时间的方法:

long a= System.currentTimeMillis();//获取当前系统时间(毫秒)
/*****执行方法*****/
System.out.println(System.currentTimeMillis()-a+"毫秒");

②提升效率

尽量避免随意使用静态变量 尽量使用final修饰符 避免使用全局变量,而尽量在逻辑分支中创建对象 在未发生线程安全前提下尽量使用HashMap、ArrayList而不是HashTable、Vector等 尽量使用移位>>(或<<)来代替/(或*)的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值