第四阶段---day02

1.常见的注册中心

1.雅虎 —ZK zookeeper
2.Netfix— Eureka
3.Alibaba—Nacos----不仅可以作为注册中心,还可以作为配置中心
4.Google—Consul
选择上的时候,从社区活跃度,稳定性,功能,性能等方面进行考虑

2.Nacos

1>准备工作

1.确保配置了JAVA_HOME
2.确保你的MySQL版本为5.7以上(MariaDB10.5以上)
在这里插入图片描述
查看登陆以后数据库的信息:
1.登录后在命令行输入 status
2.查看端口号:show global variables like ‘port’;
3.登录数据库指定端口的: mysql -uroot -P3306 -p 登录3306端口数据库

2>nacos下载与安装

1.下载地址:https://github.com/alibaba/nacos/releases
2.选择对应版本直接下载
在这里插入图片描述
3.解压Nacos(最好不要解压到中文目录下),其目录结构如下

在这里插入图片描述

3>初始化配置

1.命令行登录mysql,执行sql脚本
source sql所在的绝对路径
执行成功以后,会创建一个nacos_config数据库,打开数据库会看到一些表,比如:
在这里插入图片描述

2.打开/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

4>服务启动与访问

1.在nacos的bin目录通过指令打开cmd命令行

Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):
./startup.sh -m standalone
Windows启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone

2.访问nacos服务
打开浏览器,输入http://localhost:8848/nacos地址,出现如下登陆页面:
默认账号:nacos
默认密码:nacos
在这里插入图片描述

3.服务注册与调用

业务描述:服务者和消费者,都需要注册到nacosserver这个web服务中,服务提供者为消费者提供远端调用服务

1.生产者服务创建及注册

1>创建服务提供者工程,继承父工程,并设置pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>01-sca</artifactId>
        <groupId>com.jt</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>sca-provider</artifactId>
    <dependencies>
        <!--Web服务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--服务的注册和发现(我们要讲服务注册到nacos)-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>

2>创建并修改配置文件application.yml或者application.properties,实现服务注册,关键代码如下: 配置文件一般配置端口号 服务注册配置的服务名 以及nacos的服务地址

server:
	port:8081 这是端口号
spring:
	application:
		name:sca-provider 这是配置的服务名
	cloud:
		nacos:
			discovery:  这里提供服务和发现的配置
				server-addr:localhost:8848 这是nacos的服务地址

注意: 服务名不要使用下划线,应使用横杠,这是规则.

3>创建启动类

package com.jt;

@SpringBootApplication
public class ProviderApplication {

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

4>启动启动类,然后刷新nacos服务,检测服务是否注册成功,如图:
在这里插入图片描述
5>停掉sca-provider的服务,不断刷新nacos服务列表,检查服务的健康状态

2.消费者服务发现及调用

1>在sca-provider中创建服务提供对象,基于此对象,对外提供服务

    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;
        }
    }

2>创建消费者工程,继承父工程,并且修改pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>01-sca</artifactId>
        <groupId>com.jt</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>sca-consumer</artifactId>
    
   <dependencies>
    <!--Web服务-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--服务的注册和发现(我们要讲服务注册到nacos)-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    </dependencies>
</project>

3>创建消费端的配置文件application.yml

server:
  port: 8090 设置服务消费端的端口号
spring:
  application:
    name: sca-consumer #服务注册时,服务名必须配置
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #从哪里去查找服务 就是nscos的地址

4>创建消费端的启动类

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

5>在消费端启动类中添加如下方法,用于创建RestTemplate对象,消费端利用此对象实现远端调用服务端

@Bean
public RestTemplate restTemplate (){ //基于此对象,实现远端服务调用
	return new RestTemplate ();
}

6>定义消费端的controller,在此对象方法内部实现远端服务调用

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;


/**
 * 定义服务消费端Controller,在这个Controller对象
 * 的方法中实现对远端服务sca-provider的调用
 */
@RestController
public class ConsumerController {
    /**
     * 从spring容器获取一个RestTemplate对象,
     * 基于此对象实现远端服务调用
     */
    @Autowired
    private RestTemplate restTemplate;
    /**
     * 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务
     * @return
     * 访问此方法的url: http://localhost:8090/consumer/doRestEcho1
     */
    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho01(){
        //1.定义要调用的远端服务的url
        String url="http://localhost:8081/provider/echo/8090";
        //2.基于restTemplate对象中的相关方法进行服务调用
        return restTemplate.getForObject(url, String.class);
    }

}

4.服务负载均衡设计及实现

业务描述:服务实例的并发访问比较大,会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)处理并发请求

1.LoadBalancerClient应用

LoadBalancerClient对象可以从nacos中基于服务名获取服务实例,然后在工程中基于特点算法实现负载均衡方式的调用
1.> 修改消费端controller对象,注入LoadBalancerClient对象,然后进行服务访问


  @Autowired
    private LoadBalancerClient loadBalancerClient;
  
/**
     * 负载均衡方式的服务调用
     * @return
     */
    //http://ip:port/consumer/doRestEcho2
    @GetMapping("/consumer/doRestEcho2")
    public String doRestEcho02(){
        //方案1:自己写负载均衡算法
        //定义远端服务的url地址
        //String url1="http://localhost:8081/provider/echo/{msg}";
        //String url2="http://localhost:8082/provider/echo/{msg}";
        //String[] urlArray={url1,url2};
        //String url=urlArray[new Random().nextInt(urlArray.length)];
        // 这里new Random().nextInt(urlArray.length)是随机数对象后边意思是小于数组长度的随机数
        //基于RestTemplate借助http协议向远端服务发起Get请求
        //return restTemplate.getForObject(url,
        //String.class,serverPort);//String.class为url对应服务的响应结果类型

        //方案2:从nacos中动态获取服务列表,并基于内置负载均衡算法获取服务实例   中介者模式
        //1)基于服务名(这个名字是nacos注册中心中的一个服务名)获取服务实例
        ServiceInstance serviceInstance =
                loadBalancerClient.choose("sca-provider");//选择的是nacos中的dataid
        //2)基于服务实例构建远端服务url
        String url="http://%s:%s/provider/echo/{msg}";
        String ip=serviceInstance.getHost();
        int port=serviceInstance.getPort();
        url=String.format(url,ip,port);//动态拼接成url
        //3)进行远端服务调用
        return restTemplate.getForObject(url,
                String.class,serverPort);
    }

2>打开idea服务启动配置,并修改为允许并发运行
在这里插入图片描述
在这里插入图片描述
3>修改sca-provider的配置文件端口,分别以8081,8082端口方式进行启动。

server:
  port: 8082
spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      server-addr: localhost:8848

4>启动成功以后,访问nacos的服务列表,检测服务是否成功注册,如图所示:
在这里插入图片描述
5>启动sca-consumer项目模块,打开浏览器对consumer服务进行访问,访问时不断刷新,检测页面数据变化。
在这里插入图片描述
在这里插入图片描述
注意:多个实例并发提供服务的方式为负载均衡,这里的负载均衡实现默认是因为Nacos集成了Ribbon来实现的,Ribbon配合RestTemplate,可以非常容易的实现服务之间的访问。Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是客户端的负载均衡(客户端可以采用一定算法,例如轮询访问,访问服务端实例信息),这个功能可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡方式的服务调用。

核心知识点,常见问题总结

https://yutian.blog.csdn.net/article/details/123087753

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值