前言 :本文重要阐述微服务架构中的服务管理,以及Nacos环境搭建、服务注册、服务调用,负载均衡以及Feign实现服务调用。
服务管理
服务管理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。 服务注册:在服务管理框架中,都会构建一个注册中心,每个服务单位向注册中心登记自己提供服 务的详细信息。并在注册中心形成一张服务的清单,服务注册中心须要以心跳的方式去监测清单中 的服务是否可用,如果不可用,须要在服务清单中剔除不可用的服务。 服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对详细服务实 例的访问。 这里另有一个必不可少的组件,就是服务注册中心,它是微服务架构非常重要的一个组件,在微服务架构里重要起到了和谐者的一个作用。
常见的服务注册中心
Zookeeper:是一个分布式服务框架,重要用来解决分布式应用中经常碰到的数据管理题目,如:统一定名服务、状态同步服务、集群管理、分布式应用 设置项的管理等。
Eureka:Spring Cloud 微服务框架默认的也是推荐的服务注册中心,重要作用就是做服务注册和发现。重要面向分布式,服务化的体系提供服务注册、服务发现 和 设置管理的功能。
Nacos:Ailibab旗下的开源项目,是一个更易于构建云原生应用的动态服务发现、设置管理和服务管理平台,负责服务注册发现和服务设置。
对比总结
特性EurekaNacosZookeeper一致性模型APAP/CP 可切换CP健康查抄心跳TCP/HTTP/自界说心跳设置管理不支持支持支持(ZNode)多数据中心不支持支持不支持社区生态停滞活泼(阿里云)成熟(Apache)实用场景Spring Cloud 旧项目全功能服务管理强一致性和谐服务 Nacos
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款集服务注册与发现、设置管理于一体的动态服务管理平台。它资助开辟者构建云原生应用和微服务架构,实现服务的动态发现、健康管理、设置统一管理等功能。
环境搭建
下载地址:https://github.com/alibaba/nacos/releases 进入bin目次
启动Nacos
- startup.cmd -m standalone
复制代码 访问网址:127.0.0.1:8848/nacos
服务注册
1.添加依赖
- <!--nacos 客户端-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- </dependency>
复制代码 2.启动类注解标签
3. 界说服务名,添加nacos服务地址
- spring:
- application:
- name: service-order #服务名
- cloud:
- nacos:
- discovery:
- server-addr: 127.0.0.1:8848 #nacos 地址
复制代码
此时商品,订单,用户服务均已注册乐成。
服务调用
利用 nacos 客户端根据服务名动态获取服务地址和端口 - @RestController
- @RequestMapping("/order")
- public class OrderController{
- @Autowired
- OrderService orderService;
- @Autowired
- DiscoveryClient discoveryClient;
- @Autowired
- RestTemplate restTemplate;
- @RequestMapping("/create/{pid}/{uid}/{num}")
- public Order createOrder(@PathVariable("pid") int pid, @PathVariable("uid")int uid, @PathVariable("num") int num){
- ServiceInstance serviceInstance = discoveryClient.getInstances("service-product").get(0);
- //ip + port
- String purl = serviceInstance.getHost() + ":" + serviceInstance.getPort();
- //使用
- ServiceInstance userviceInstance = discoveryClient.getInstances("service-user").get(0);
- //ip + port
- String uurl = userviceInstance.getHost() + ":" + userviceInstance.getPort();
- Product p = restTemplate.getForObject( "http://" + purl + "/product/get/" + pid, Product.class);
- User u = restTemplate.getForObject( "http://" + uurl + "/user/get/" + uid, User.class);
- Order order= null;
- if(p!=null){
- if(p.getStock()>=num){
- if(u!=null){
- order = orderService.saveorder(pid,uid,num);
- }
- }
- }
- return order;
- }
- }
复制代码 与单一利用 RestTemplate 利用 http 方式远程访问相比,解决了很多繁琐的步骤与人工维护。
负载均衡
负载均衡就是将负载(工作任务,访问哀求)举行分摊到多个操纵单位(服务器,组件)上举行执行。 自界说实现
1.修改端口启动多个商品微服务
2.将获取服务的方式改为随机获取
核心代码:
- //获取服务列表
- List<ServiceInstance> instances =
- discoveryClient.getInstances("service-product");
- //随机生成索引
- Integer index = new Random().nextInt(instances.size());
- //获取服务
- ServiceInstance productService = instances.get(index);
- //获取服务地址
- String purl = productService.getHost() + ":" +
- productService.getPort();
复制代码 Ribbon实现
Ribbon 是 Spring Cloud 的一个组件, 它可以让我们利用一个注解就能轻松的搞定负载均衡。
1.在 RestTemplate 的天生方法上添加@LoadBalanced 注解
2.修改服务调用的方法
- Product p = restTemplate.getForObject( "http://service-product/product/get/" + pid, Product.class);
- User u = restTemplate.getForObject( "http://service-user/user/get/" + uid, User.class);
复制代码 Ribbon 支持的负载均衡计谋 Ribbon 内置了多种负载均衡计谋,内部负载均衡的顶级接口为 com.netflix.loadbalancer.IRule
3. 设置
- ribbon:
- ConnectTimeout: 2000 # 请求连接的超时时间
- ReadTimeout: 5000 # 请求处理的超时时间
- service-product: # 调用的提供者的名称
- ribbon:
- NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule #负载均衡策略
复制代码 Ribbon 的七种负载均衡计谋
轮询计谋: RoundRobinRule,按照肯定的次序依次调用服务实例。比如一 共有 3 个服务,第一次调用服务 1,第二次调用服务 2,第三次调用服务 3, 依次类推。 - NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
复制代码 权重计谋: WeightedResponseTimeRule,根据每个服务提供者的相应时 间分配一个权重,相应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始利用轮询计谋并开启一个计时器,每一段时间网络一次所有服 务提供者的平均相应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。 - NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
复制代码 随机计谋: RandomRule,从服务提供者的列表中随机选择一个服务实例。 - NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
复制代码 最小连接数计谋: BestAvailableRule,也叫最小并发数计谋,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有类似的最小连接数,那么会调用轮询计谋举行选取。 - NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule
复制代码 可用敏感性计谋: AvailabilityFilteringRule,先过滤掉非健康的服务实例, 然后再选择连接数较小的服务实例。 - NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule
复制代码 区域敏感计谋: ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该计谋和轮询计谋类似。 - NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
复制代码 Feign
服务调用
1.添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- </dependency>
复制代码 2.启动类添加Feign注解
- @EnableFeignClients//开启 Fegin
复制代码 3.创建Service接口,利用Feign实现服务调用
- @FeignClient(name = "service-product")
- public interface ProductService {
- @GetMapping("/product/get/{id}")
- Product findProductById(@PathVariable int id);
- }
复制代码 4.调用
- //使用前要注入
- @Autowired
- ProductService productService;
复制代码- //使用feign
- Product p = productService.findProductById(pid);
- //不使用feign
- User u = restTemplate.getForObject( "http://service-user/user/get/" + uid, User.class);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |