IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> springcloud(二) nacos服务治理 -> 正文阅读

[Java知识库]springcloud(二) nacos服务治理

目录

一、nacos的作用

二、安装与启动nacos

三、项目集成nacos

一、pom.xml导入依赖:

二、在主类上添加@EnableDiscoveryClient注解

三、配置文件

四、搭建服务集群:

手动方式实现负载均衡:

五、基于Ribbon实现负载均衡

不同的负载均衡策略:

六、优化:使用Fegin替换restTemplate实现服务调用

一、加入依赖

二、在主类上加上Fegin的注解

三、创建service并使用Fegin实现微服务的调用

四、在此基础上修改controller的代码并启动验证

思考一:为什么关掉nacos的终端窗口还是可以对服务进行访问?


一、nacos的作用

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

从上面的介绍就可以看出,nacos的作用就是一个注册中心,用来管理注册上来的各个微服务。

1. 服务发现:

  1. 服务注册:保存服务提供者和服务调用者的信息
  2. 服务订阅:服务调用者订阅服务提供者的信息,注册中心向订阅者推送提供者的信息

2. 服务配置:

  1. 配置订阅:服务提供者和服务调用者订阅微服务相关的配置
  2. 配置下发:主动将配置推送给服务提供者和服务调用者

3. 服务健康检测

  1. 检测服务提供者的健康情况,如果发现异常,执行服务剔除

二、安装与启动nacos

编辑startup.cmd

双击启动:

访问nacos:http://localhost:8848/nacos,默认密码是nacos/nacos

三、项目集成nacos

一、pom.xml导入依赖:

<dependency> 
<groupId>com.alibaba.cloud</groupId> 
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 
</dependency>

二、在主类上添加@EnableDiscoveryClient注解

该注解能够让注册中心能够发现,扫描到该服务
@SpringBootApplication

@EnableDiscoveryClient

public class ProductApplication

三、配置文件

spring: 
cloud: 
nacos: 
discovery: 
server-addr: 127.0.0.1:8848

四、搭建服务集群:

设置相同的启动类,然后设置不同的端口。

启动两个服务可以看到两个服务都在运行!

打开nacos(http://localhost:8848/nacos)可以看到实例数增加为2.

手动方式实现负载均衡:

修改controller类的方法

/**
 * @author Dragon code!
 * @create 2022-05-04 16:46
 */
@RestController
@Slf4j
public class OrderController {
    @Resource
    private OrderService orderService;
    @Resource
    //可以发出基于http协议的rest风格的请求
    private RestTemplate restTemplate;
    @Resource
    //发现者,利用发现者对象访问服务时通过服务名来访问
    private DiscoveryClient discoveryClient;
    @RequestMapping("/order/prod/{pid}")
    public Order save(@PathVariable Integer pid){
        log.info("准备调用商品服务查询商品信息");
        //此时的instances就是我们要访问的所有服务(实现负载均衡)
        List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
        //随机函数实现负载均衡
        ServiceInstance instance = instances.get(new Random().nextInt(instances.size()));
        log.info("调用的微服务的地址是:"+instance.getPort());
        //动态获取url
        String url = "http://" + instance.getHost() + ":" + instance.getPort();
        //Product product = restTemplate.getForObject("http://localhost:8081/product/" + pid, Product.class);
        Product product = restTemplate.getForObject(url + "/product/" + pid, Product.class);
        log.info("商品微服务返回的商品"+ JSON.toJSONString(product));
        log.info("创建订单对象");
        Order order = new Order();
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);
        order.setPid(product.getPid());
        order.setUsername("测试用户");
        orderService.save(order);
        return order;
    }
}

再次进行访问(不断刷新)可以看到我们的端口号是在不断的变化的负载均衡达到!

五、基于Ribbon实现负载均衡

Ribbon是Spring Cloud的一个组件, 它可以让我们使用一个注解就能轻松的搞定负载均衡

第1步:在RestTemplate 的生成方法上添加@LoadBalanced注解

?启动类:

/**
 * @author Dragon code!
 * @create 2022-05-04 16:43
 */
@SpringBootApplication
@EnableDiscoveryClient
@EntityScan(basePackages = "com.lay.shop.entity")
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    //restTemplate可以利用Ribbon实现负载均衡
    @LoadBalanced
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate;
    }
}

controller类的方法修改如下:

精髓在于加了LoadBalanced注解的restTemplate对象会根据服务名到nacos治理中心去自己实现负载均衡

    @RequestMapping("/order/prod/{pid}")
    public Order save(@PathVariable Integer pid){
        log.info("准备调用商品服务查询商品信息");
        //直接使用微服务名字, 从nacos中获取服务地址
        String url = "service-product";
        // Product product = restTemplate.getForObject("http://localhost:8081/product/" + pid, Product.class);
        Product product = restTemplate.getForObject("http://"+url + "/product/" + pid, Product.class);
        log.info("商品微服务返回的商品"+ JSON.toJSONString(product));
        log.info("创建订单对象");
        Order order = new Order();
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);
        order.setPid(product.getPid());
        order.setUsername("测试用户");
        orderService.save(order);
        return order;
    }

不同的负载均衡策略:

?我们可以通过修改配置来调整Ribbon的负载均衡策略,具体代码如下

属于自定义配置,加载order项目的配置文件中

service-product: # 调用的提供者的名称 
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

六、优化:使用Fegin替换restTemplate实现服务调用

Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单(有点像rpc的远程调用), 只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

那么使用Fegin的好处就在于它既能实现远程过程调用,又可以实现负载均衡!

一、加入依赖

<dependency> 
<groupId>org.springframework.cloud</groupId> 
<artifactId>spring-cloud-starter-openfeign</artifactId> 
</dependency>

二、在主类上加上Fegin的注解

/**
 * @author Dragon code!
 * @create 2022-05-04 16:43
 */
@SpringBootApplication
@EnableDiscoveryClient
//开启Fegin
@EnableFeignClients
@EntityScan(basePackages = "com.lay.shop.entity")
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    //restTemplate可以利用Ribbon实现负载均衡
    @LoadBalanced
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate;
    }
}

三、创建service并使用Fegin实现微服务的调用

注意先到调用的提供者(service-prouct)的service中声明提供者的name

@FeignClient+@GetMapping 就是一个完整的请求路径!

http://service- product/product/{pid}

注意点:此处新建的service是参考在order工程里面controller类的方法(也就是红框部分),然后实现修改。

修改后的接口如下:注意接口的方法要加上PathVariable注解实现url属性的映射

/**
 * @author Dragon code!
 * @create 2022-05-04 15:42
 */
@FeignClient("service-product")//声明调用的提供者的name
public interface ProductService {
    @GetMapping(value = "/product/{pid}")
    Product findByPid(@PathVariable("pid") Integer pid);
}

四、在此基础上修改controller的代码并启动验证

/**
 * @author Dragon code!
 * @create 2022-05-04 16:46
 */
@RestController
@Slf4j
public class OrderController {
    @Resource
    private OrderService orderService;
//    @Resource
//    //可以发出基于http协议的rest风格的请求
//    private RestTemplate restTemplate;
//    @Resource
//    //发现者,利用发现者对象访问服务时通过服务名来访问
//    private DiscoveryClient discoveryClient;

    @Resource
    private ProductService productService;

    @RequestMapping("/order/prod/{pid}")
    public Order save(@PathVariable Integer pid){
        log.info("准备调用商品服务查询商品信息");
        //直接使用微服务名字, 从nacos中获取服务地址
        String url = "service-product";
        //通过fegin调用商品微服务
        Product product = productService.findByPid(pid);
        log.info("商品微服务返回的商品"+ JSON.toJSONString(product));
        log.info("创建订单对象");
        Order order = new Order();
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());
        order.setNumber(1);
        order.setPid(product.getPid());
        order.setUsername("测试用户");
        orderService.save(order);
        return order;
    }
}

注释启动类的老办法与注解

访问成功:

说明Fegin替代restTemplate实现rpc成功!

思考一:为什么关掉nacos的终端窗口还是可以对服务进行访问?

????????其实每一次的访问并不是都走nacos的,第一次访问后,我们的访问地址会被缓存到本地,即使关了nacos但是只要不关idea里的服务器,还是可以进行访问,但是只要idea项目停了缓存就会被清除,此时再重启会发现访问不了。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-06 10:55:43  更:2022-05-06 10:56:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:08:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码