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)负载均衡
RestTemplate
是Spring
提供的一个访问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
Ribbon
是 Netflix
公司的一个开源的负载均衡 项目,是一个客户端/进程内负载均衡器,运行在消费者端。其工作原理就是 Consumer
端获取到了所有的服务列表之后,在其内部使用负载均衡算法,进行对多个系统的调用。
Nignx
和 Ribbon
不同的是,它是一种集中式的负载均衡器。在 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等 尽量使用移位>>(或<<)来代替/(或*)的操作