学习SpringCloud的第二天

目录

注册中心

背景分析

Nacos概述

 构建Nacos服务

1.配置环境

idea运行mysql

nacos的访问

访问是在bin目录下cmd执行启动

或者使用idea进行启动

细节说明:

访问Nacos服务

业务描述

生产者服务的创建(module名为sca-provider,继承工程01-sca)

创建服务消费者工程(module名为sca-consumer,假如已有则无需创建),继承parent工程(01-sca)

 对服务提供者和服务消费者进行注册(在nacos上)

对sca-provider进行注册

 对sca-consumer进行相同的修改,实现nacos注册,并观察其健康数

小杰分析

服务负载均衡设计及实现(重点)

业务描述

LoadBalancerClient应用


注册中心

背景分析

在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带,由此注册中心诞生(例如淘宝网卖家提供服务,买家调用服务)。
市面上常用注册中心有Zookeeper(雅虎Apache),Eureka(Netfix),Nacos(Alibaba),Consul(Google),那他们分别都有什么特点,我们如何进行选型呢?我们主要从社区活跃度,稳定性,功能,性能等方面进行考虑即可.本次微服务的学习,我们选择Nacos,它很好的支持了阿里的双11活动,不仅可以做注册中心,还可以作为配置中心,稳定性和性能都很好。

Nacos概述

Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴,成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。其官网地址如下:

Nacos 快速开始

 构建Nacos服务

1.配置环境

1.配置JAVA_HOME的环境变量,他的地址是jdk8的详细地址

2.确保你的mysql地址是5.7以上,或者mariaDB10.3以上

3.下载与安装nacos(网站很卡)

Releases · alibaba/nacos · GitHub

 4.找到对应的版本进行下载(.gz是Linux系统的版本,.zip是windows的下载版本,其他两个是源码)

学习SpringCloud的第二天_第1张图片

 5.第三步,解压文件夹

 6.nacos初始化配置

执行sql脚本文件/nacos/conf/nacos-mysql.sql(注意:nacos中的sql脚本文件没有创建库函数,如果需要使用,要先加入库函数的创建)如有需要sql文件,评论区留言,本人第一次写文章,不会加入文件,或者有会的大佬,可以在评论去教一下我。

idea运行mysql

学习SpringCloud的第二天_第2张图片

 mysql的登录

学习SpringCloud的第二天_第3张图片

 最后点击Test Connection进行测试,观察MySQL的登陆是否成功

7.打开/nacos/conf/application.properties里打开默认配置,并基于你当前环境配置要连接的数据库,连接数据库时使用的用户名和密码(假如前面有"#"要将其去掉)

### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

nacos的访问

访问是在bin目录下cmd执行启动

Windows启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):

./startup.sh -m standalone

或者使用idea进行启动

第一步,找启动管理界面

 第二步,点击+号,找Shell  Script

学习SpringCloud的第二天_第4张图片

第三步:按图配置内容

学习SpringCloud的第二天_第5张图片

 配置成功点击run按钮即可运行

细节说明:

说明:
1)执行执行令时要么配置环境变量,要么直接在nacos/bin目录下去执行.
2)nacos启动时需要本地环境变量中配置了JAVA_HOME(对应jdk的安装目录),
3)一定要确保你连接的数据库(nacos_config)是存在的.
4)假如所有的配置都正确,还连不上,检查一下你有几个数据库(mysql,…)

访问Nacos服务

打开浏览器,输入http://localhost:8848/nacos地址,出现如下登陆页面:

在这里插入图片描述

 其中,默认账号密码为nacos/nacos

业务描述

我们需要创建两个项目Module分别为服务提供者和服务消费者(假如之前是跟着我的贴子做的则无需创建),然后服务提供者可以为服务消费者提供远端调用服务(例如支付服务为服务提供方,订单服务为服务消费方),

生产者服务的创建(module名为sca-provider,继承工程01-sca)

1.pom.xml添加依赖web的依赖


    org.springframework.boot
    spring-boot-starter-web

 2.创建配置文件application.yml,配置文件格式严格,一定要按格式写

server:
  port: 8081
spring:
  application:
    name: sca-provider #进行服务注册必须配置服务名

 3.创建启动类

package com.jt;

@SpringBootApplication
public class ProviderApplication {

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

 4.在sca-provider项目中创建服务提供方对象,基于此对象对外提供服务(由于需要和前端进行交互,所以需要加入controller层的注解,然后用value设置端口号,文中为默认获取application.yml的端口信息)

 package com.jt.provider.controller;
    /**定义Controller对象(这个对象在spring mvc中给他的定义是handler),
     * 基于此对象处理客户端的请求*/
    @RestController
    public class ProviderController{
        //@Value默认读取项目配置文件中配置的内容
        //8080为没有读到server.port的值时,给定的默认值
        @Value("${server.port:8080}")
        private String server;
        //http://localhost:8081/provider/echo/tedu
        @GetMapping("/provider/echo/{msg}")
        public String doRestEcho1(@PathVariable String msg){
            return server+" say hello "+msg;
        }
    }

创建服务消费者工程(module名为sca-consumer,假如已有则无需创建),继承parent工程(01-sca)

1.pom.xml中添加依赖如下:


    org.springframework.boot
    spring-boot-starter-web

 2.创建配置文件application.yml,配置文件格式严格,一定要按格式写

server:
  port: 8090
spring:
  application:
    name: sca-consumer #服务注册时,服务名必须配置

 3.创建启动类

package com.jt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);

    }
}

 4.在启动类中创建RestTemplate对象(@bean注解是spring  Ioc的注解,用来把创建的对象交给spring'管理,一般和@Configuration连用。RestTemplate  spring中的用来进行远程传输的类)

@Bean//远端调用工具RestTemplate,spring固有传输类
public RestTemplate restTemplate(){
    return new RestTemplate();
}

 5.定义sca-consumer服务的消费端Controller,在此对象方法内部实现远端服务调用(因为要和前端进行互联,所以我们使用controller注解,然后对远程调用(RestTemplate对象)进行依赖注入,创建sul为sca-provider的前端调用的地址,使用getForObject方法对sca-provider对象的返回值进行获取并展示(getForObject方法的第一个参数是url是地址值,第二个参数是你所调用的方法的返回值类型))

 

package com.jt.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;


@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho1(){
        //你要调用的nacos上的另一个需要调用的信息的地址
        String url="http://localhost:8081/provider/echo/sca-consumer";
        return restTemplate.getForObject(url,
                String.class //你调用的方法的返回值类型
                 );
    }
}

 同时开启两个启动类,并使用localhost:8090/consumer/doRestEcho2进行互联,结果显示为

学习SpringCloud的第二天_第6张图片

 对服务提供者和服务消费者进行注册(在nacos上)

对sca-provider进行注册

pom.xml添加依赖(这个依赖会每5秒对nacos发送一个心跳包,让nacos检测到注册类的健康指数,当你关闭启动类,不停刷新nacos,你可以观察到sca-provider的健康指数会从1变为0,再到sca-provider被nacos毁灭的现象)



    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

application.yml的修改(文中为修改之后的样子)

server:
  port: 8090
spring:
  application:
    name: sca-consumer #服务注册时,服务名必须配置
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #从哪里去查找服务

 修改完成之后,开启启动类,可以观察到已经注册成功

学习SpringCloud的第二天_第7张图片

 对sca-consumer进行相同的修改,实现nacos注册,并观察其健康数

小杰分析

为什么要将服务注册到nacos?(为了更好的查找这些服务)
在Nacos中服务提供者是如何向Nacos注册中心(Registry)续约的?(5秒心跳)
对于Nacos服务来讲它是如何判定服务实例的状态?(检测心跳包,15,30)
服务消费方是如何调用服务提供方的服务的?(RestTemplate)

服务负载均衡设计及实现(重点)

业务描述

一个服务实例可以处理请求是有限的,假如服务实例的并发访问比较大,我们会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)的处理并发请求,在Nacos中服务的负载均衡(Nacos客户端负载均衡)是如何应用的?

LoadBalancerClient应用

LoadBalancerClient对象可以从nacos中基于服务名获取服务实例,然后在工程中基于特点算法实现负载均衡方式的调用,案例实现如下:(在ConsumerController类中加入如下代码)

    @Autowired(LoadBalancerClient用来从nacos中获取数据)
    private LoadBalancerClient loadBalancerClient;

    @Value("${spring.application.name:8090}")
    public String appName;(本类注册的接口的名字)

    @GetMapping("/consumer/doRestEcho2")
    public String doRestEcho02(){
        ServiceInstance serviceInstance = //获取sca-provider的信息
                                loadBalancerClient.choose("sca-provider");
        //%s代表占位符,serviceInstance.getInstanceId()解释前边的占位符
        String url=String.format("http://%s/provider/echo/%s",
                serviceInstance.getInstanceId(),serviceInstance.getServiceId());

        return restTemplate.getForObject(url,String.class);
    }
}

 

你可能感兴趣的:(eureka,java,spring)