哪种网站开发简单,传奇免费网站模板下载,深圳公司网站设计哪家好,做企业宣传网站公司目录 服务治理服务治理介绍什么是服务治理相关方案 nacos实战入门搭建nacos环境安装nacos启动nacos访问nacos 将商品微服务注册进nacos将订单微服务注册进nacos订单服务通过nacos调用商品服务 实现服务调用的负载均衡什么是负载均衡代码实现负载均衡增加一个服务提供者自定义实… 目录 服务治理服务治理介绍什么是服务治理相关方案 nacos实战入门搭建nacos环境安装nacos启动nacos访问nacos 将商品微服务注册进nacos将订单微服务注册进nacos订单服务通过nacos调用商品服务 实现服务调用的负载均衡什么是负载均衡代码实现负载均衡增加一个服务提供者自定义实现负载均衡用ribbon实现负载均衡 基于feign实现服务调用什么是feignfeign的使用 服务治理
服务治理介绍
通过上一章的操作我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址(ip端口等硬编码到了代码中这种做法存在许多问题
一旦服务提供者地址变化就需要手工修改代码 一旦是多个服务提供者无法实现负载均衡功能 一旦服务变得越来越多人工维护调用关系困难
那么应该怎么解决呢这时候就需要通过注册中心动态的实现服务治理。
什么是服务治理
服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。
服务注册和心跳机制/续约在服务治理框架中都会构建一个注册中心每个服务单元向注册中心登记自己提供服务的详细信息并在注册中心形成一张服务的清单服务注册中心需要以心跳的方式去监测清单中的服务是否可用如果不可用需要在服务清单中剔除不可用的服务。
服务发现服务调用方向服务注册中心咨询服务并获取所有服务的实例清单实现对具体服务实例的访问。
相关方案
zookeeper zookeeper是一个分布式服务框架是Apache Hadoop的一个子项目它主要是用来解决分布式应用中经常遇到的一些数据管理问题如统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。 consul Consul是基于GO语言开发的开源工具主要面向分布式服务化的系统提供服务注册、服务发现和配置管理的功能。Consul的功能都很实用其中包括服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件所以安装和部署都非常简单只需要从官网下载后在执行对应的启动脚本即可。 eureka Eureka是Springcloud Netflix中的重要组件,主要作用就是做服务注册和发现。但是现在已经闭源 nacos Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是Spring Cloud Alibaba组件之一负责服务注册发现和服务配置可以这样认为nacoseurekaconfig。
nacos实战入门 搭建nacos环境
安装nacos
下载地址https://github.com/alibaba/nacos/releases 下载zip版本解压缩
启动nacos
双击或命令行
cd nacos/bin
startup.cmd -m standalone访问nacos
打开浏览器输入http://localhost:8848/nacos即可访问服务默认密码是nacos/nacos 如果有服务注册进来会显示在服务列表
将商品微服务注册进nacos
导包 dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencyapplication.yml中添加nacos服务地址 cloud:nacos:discovery:server-addr: localhost:8848启动类注解
SpringBootApplication
EnableDiscoveryClient
public class ProductApp {public static void main(String[] args) {SpringApplication.run(ProductApp.class,args);}
}启动服务观察nacos的控制面板中是否有注册上来的商品微服务
将订单微服务注册进nacos
导包配置启动类注解都同上
订单服务通过nacos调用商品服务
OrderController /*** 用nacos调用服务*/RequestMapping(/order/product2/{pid})public Order createOrder2(PathVariable(pid) Integer pid) {log.info(接收到{}号商品的下单请求接下来调用商品微服务查询此商品信息, pid);// 调用商品微服务查询商品信息ListServiceInstance instances discoveryClient.getInstances(service-product);ServiceInstance instance instances.get(0);Product product restTemplate.getForObject(http:// instance.getHost() : instance.getPort() /product/ pid, Product.class);log.info(查询到{}号商品的信息内容是{}, pid, JSON.toJSONString(product));// 下单/创建订单Order order new Order();order.setUid(1);order.setUsername(测试用户);order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);log.info(创建订单成功订单信息为{}, JSON.toJSONString(order));return order;}浏览器访问测试http://localhost:8091/order/product2/2
实现服务调用的负载均衡
什么是负载均衡
通俗的讲负载均衡就是将负载(工作任务访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。根据负载均衡发生位置的不同一般分为服务端负载均衡和客户端负载均衡。 服务端负载均衡指的是发生在服务提供者一方比如常见的nginx负载均衡 而客户端负载均衡指的是发生在服务请求的一方也就是在发送请求之前已经选好了由哪个实例处理请求。 我们在微服务调用关系中一般会选择客户端负载均衡也就是在服务调用的一方来决定服务由哪个提供者执行。
代码实现负载均衡
增加一个服务提供者
一个项目并行运行的第二种方式 编辑配置 - 添加新配置 - springboot 设置新名称如ProductApp2 设置启动类如ProductApp 修改端口号如虚拟机选项-Dserver.port8082 启动后可在nacos中看到增加了一个服务实例
自定义实现负载均衡
修改消费者中OrderController的代码 /*** 用nacos调用服务并自定义实现负载均衡*/RequestMapping(/order/product3/{pid})public Order createOrder3(PathVariable(pid) Integer pid) {log.info(接收到{}号商品的下单请求接下来调用商品微服务查询此商品信息, pid);// 调用商品微服务查询商品信息ListServiceInstance instances discoveryClient.getInstances(service-product);int i new Random().nextInt(instances.size());ServiceInstance instance instances.get(i);log.info(第{}台机器端口号是{},i1,instances.get(i).getPort());Product product restTemplate.getForObject(http:// instance.getHost() : instance.getPort() /product/ pid, Product.class);log.info(查询到{}号商品的信息内容是{}, pid, JSON.toJSONString(product));// 下单/创建订单Order order new Order();order.setUid(1);order.setUsername(测试用户);order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);log.info(创建订单成功订单信息为{}, JSON.toJSONString(order));return order;}浏览器访问测试http://localhost:8091/order/product3/3
用ribbon实现负载均衡
添加LoadBalanced注解
SpringBootApplication
EnableDiscoveryClient
public class OrderApp {public static void main(String[] args) {SpringApplication.run(OrderApp.class,args);}BeanLoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}修改消费者的OrderController的代码 /*** 用nacos调用服务并用ribbon实现负载均衡*/RequestMapping(/order/product4/{pid})public Order createOrder4(PathVariable(pid) Integer pid) {log.info(接收到{}号商品的下单请求接下来调用商品微服务查询此商品信息, pid);// 调用商品微服务查询商品信息Product product restTemplate.getForObject(http://service-product/product/ pid, Product.class);log.info(查询到{}号商品的信息内容是{}, pid, JSON.toJSONString(product));// 下单/创建订单Order order new Order();order.setUid(1);order.setUsername(测试用户);order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);log.info(创建订单成功订单信息为{}, JSON.toJSONString(order));return order;}浏览器访问测试http://localhost:8091/order/product4/1
如果想用默认的轮询以外的其他策略可在消费者的yml中加入以下配置
service-product: # 调用的提供者的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule基于feign实现服务调用
什么是feign
Feign是Spring Cloud提供的一个声明式的伪Http客户端它使得调用远程服务就像调用本地服务一样简单只需要创建一个接口并添加一个注解即可。
Nacos很好的兼容了FeignFeign默认集成了Ribbon所以在Nacos下使用Fegin默认就实现了负载均衡的效果。
feign的使用
导包 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency启动类加注解
EnableFeignClients(basePackages cn.ming.client) //如果是主内所在子包可以不用加basePackages但是最好加上调用接口
FeignClient(value service-product) //value用于指定调用nacos下哪个微服务
public interface ProductClient {// 商品信息查询RequestMapping(/product/{pid}) //FeignClient的value RequestMapping的value值 其实就是完整的请求地址Product getProductByPid(PathVariable(pid) Integer pid);
}应用 /*** 用nacos调用服务并用feign实现带有负载均衡的调用*/RequestMapping(/order/product5/{pid})public Order createOrder5(PathVariable(pid) Integer pid) {log.info(接收到{}号商品的下单请求接下来调用商品微服务查询此商品信息, pid);// 调用商品微服务查询商品信息Product product productClient.getProductByPid(pid);log.info(查询到{}号商品的信息内容是{}, pid, JSON.toJSONString(product));// 下单/创建订单Order order new Order();order.setUid(1);order.setUsername(测试用户);order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);log.info(创建订单成功订单信息为{}, JSON.toJSONString(order));return order;}浏览器访问测试http://localhost:8091/order/product5/4