服务治理
将服务注册到服务中心nacos上,每一个服务都部署到一个tomcat上,使用频繁的服务可以部署集群,每一个服务都有自己的ip+port,服务名称相同,业务相同,通过使用ribbon进行负载均衡,使用feign进行服务间的互相调用。feign中默认集成了ribbon。
1、什么是服务治理?
服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。
服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服 务的详细信息。并在注册中心形成一张服务的清单,服务注册中心需要以心跳的方式去监测清单中 的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。
服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实 例的访问。
常见的注册中心
1.Erueka
2.Zookeeper
3.Consul
4.Nacos
2、Nacos:
2.1 什么是Nacos?
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
从上面的介绍就可以看出,nacos的作用就是一个注册中心,用来管理注册上来的各个微服务。
2.2 安装nacos
下载nacos
启动nacos
nacos启动成功,端口号8848,使用浏览器访问
http://localhost:8848/nacos
用户名密码都为nacos
2.3 使用nacos
引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
在application.yml配置nacos
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
在启动类上加入注解
@EnableDiscoveryClient
重新启动两个微服务发现nacos多出两个服务
修改代码
之前的
Product product = restTemplate.getForObject("http://localhost:8081/product/productById/" + pId, Product.class);
修改成
@Autowired
private DiscoveryClient discoveryClient;
//在方法里加入
List<ServiceInstance> instances = discoveryClient.getInstances("shop-product");
ServiceInstance serviceInstance = instances.get(0);
Product product = restTemplate.getForObject(serviceInstance.getUri()+"/product/productById/" + pId, Product.class);
3、服务调用的负载均衡
3.1 什么是负载均衡
通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡 而客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求.
我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行.
3.2 基于Ribbon实现负载均衡
1.什么是Ribbon
ribbon是 Netflix 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在SpringCloud 中, nacos一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从nacos中读 取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。 在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的 列表信息,并基于内置的负载均衡算法,请求服务。
2.Ribbon的主要作用
(1)服务调用
基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进行调用
(2)负载均衡
当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址
Ribbon是Spring Cloud的一个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡
3.3 ribbon实现负载均衡的步骤
nacos依赖中包含riboon依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
配置application.yml
shop-product: # 这里写调用服务的名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
#使用的的负载均衡策略
ribbon需要依赖restTemplate,加入注解@LoadBalanced
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
修改代码,访问服务名称,ribbon自动负载均衡
Product product = restTemplate.getForObject("http://shop-product/product/productById/" + pId, Product.class);
模拟启动多个服务
测试:
4、基于OpenFeign实现服务调用
4.1 什么是Feign
Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。
Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。
4.2 使用feign调用服务
服务模块引入依赖
<!--feign的jar文件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
主类加上注解@EnableFeignClients,开启feign
@EnableFeignClients
创建一个接口,写调用的方法
@FeignClient("shop-product")
public interface ProductFeign {
@GetMapping("/product/productById/{id}")
public Product findById(@PathVariable("id") Integer pId ) ;
}
使用,注入需要使用的类中,调用其中的方法(就像在调用本地方法一样)
@Autowired
private ProductFeign productFeign;
注意:feign跟swagger依赖冲突,可能报空指针,将swagger2版本提到2.5.0以上就解决了