栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

微服务 - nacos

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

微服务 - nacos

注册、配置
  • nacos准备工作
    • 1.配置java环境变量
    • 2.下载与安装nacos
    • 3.解压nacos
    • 4.在sql脚本中添加如下内容
    • 5.初始化配置
    • 6.启动nacos
    • 7.访问nacos服务
  • 一. 注册服务
    • 1.添加依赖
    • 2.启动nacos服务
    • 3.编辑配置文件
  • 二. 服务间普通调用
    • 1.创建provider工程类
    • 2.创建consumer工程类
  • 三. 负载均衡方式调用
    • 1.设置IDEA多启动
    • 2.修改consumer服务
    • 3.优化代码结构:feign
      • (1). 失败回调机制
  • 一. 配置中心
    • 1.IDEA连接数据库
    • 2.创建日志对象
    • 3.添加依赖
    • 4.修改配置文件
    • 5.新建nacos配置
    • 6.启动服务,访问即可
    • 7.日志级别显示在浏览器
    • * 配置IDEA启动nacos
  • 二.Nacos配置管理模型
    • 1.命名空间
    • 2.修改配置文件
    • 3.新建分组
    • 4.新建Controller测试
    • * 共享配置设计及读取

nacos准备工作 1.配置java环境变量

2.下载与安装nacos
  1. 下载网址
https://github.com/alibaba/nacos/releases
  1. 选择对应版本
3.解压nacos

注意:

  1. 路径不要有中文和空格
  2. 确保你的MySQL版本为5.7以上(MariaDB10.5以上)
4.在sql脚本中添加如下内容
DROP DATAbase IF EXISTS `nacos_config`;
CREATE DATAbase `nacos_config` DEFAULT character set utf8mb4;
SET names utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
USE `nacos_config`;

注意:

  1. 在最上面添加上述内容
  2. 不弱不添加上述内容,可以先创建数据库在将sql脚本导入数据库即可
5.初始化配置
  1. 登陆mysql,执行老师发给同学们的sql脚本。例如,我们可以使用mysql自带客户端,在命令行首先登录mysql,然后执行如下指令:

    执行成功后会创建一个nacos_config数据库
  2. 打开/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
6.启动nacos

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

./startup.sh -m standalone

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

startup.cmd -m standalone

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

7.访问nacos服务

输入下面网址

http://localhost:8848/nacos

**提示:**默认账户和密码:nacos

一. 注册服务 1.添加依赖
  1. 添加服务注册和发现依赖
 
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
  1. 添加SpringBoot-web依赖
 
            org.springframework.boot
            spring-boot-starter-web
        
2.启动nacos服务
startup.cmd -m standalone
3.编辑配置文件
  1. 创建并修改配置文件application.yml(或者application.properties),实现服务注册
server:
   port: 8081
spring:
  application:
    name: sca-provider #进行服务注册必须配置服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 如果nacos在本机,此处可省略
  1. 启动provider即可注册成功
二. 服务间普通调用 1.创建provider工程类

1.在sca-provider项目中创建服务提供方对象,基于此对象对外提供服务

    package com.jt.provider.controller;
    
    @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.创建consumer工程类
  1. 编辑pom文件


    
        01-sca
        com.jt
        1.0-SNAPSHOT
    
    4.0.0
    sca-consumer
    
   
    
    
        org.springframework.boot
        spring-boot-starter-web
    
    
    
        com.alibaba.cloud
        spring-cloud-starter-alibaba-nacos-discovery
    
    

  1. 修改配置文件
server:
  port: 8090
spring:
  application:
    name: sca-consumer #这里提供服务名,要进行服务注册,则是nacos服务列表中的服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
# 实际注册中这里需要写nacos的具体ip地址和端口号。8848时本机默认端口号。
feign:
  hystrix:
    enabled: true
  1. 创建启动类
  2. 在启动类中添加方法,用于创建RestTemplate对象,实现服务之间条用
@Bean
    //@Bean("rt")
    //@Scope("singleton")
    //@ConditionalOnMissingBean //spring容器没有这个bean时它才会生效.
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
  1. 定义服务消费端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;

@RestController
public class ConsumerController {
    
    @Autowired
    private RestTemplate restTemplate;
    
    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho01(){
        //1.定义要调用的远端服务的url
        String url="http://localhost:8081/provider/echo/8090";
        //2.基于restTemplate对象中的相关方法进行服务调用
        return restTemplate.getForObject(url, String.class);
    }
}
  1. 访问 http://localhost:8090/consumer/doRestEcho1,测试成功即可
三. 负载均衡方式调用 1.设置IDEA多启动

通过修改配置文件端口可启动多个
可实现启动多个tomcat服务器

2.修改consumer服务
  1. 修改ConsumerController类,注入LoadBalancerClient对象,并添加doRestEcho2方法,然后进行服务访问.
  @Autowired
  private LoadBalancerClient loadBalancerClient;
  
  @GetMapping("/consumer/doRestEcho02")
 public String doRestEcho02(){
     ServiceInstance serviceInstance = loadBalancerClient.choose("sca-provider");
     String url = String.format("http://%s:%s/provider/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
     System.out.println("request url:"+url);
     return restTemplate.getForObject(url, String.class);
     }
 }

**提示:**底层基于Ribbon实现负载均衡算法
2. 启动两个provider服务,启动一个consumer服务
3. 访问consumer服务,出现不同的端口号即可

http://localhost:8090/consumer/doRestEcho02
3.优化代码结构:feign
  1. 添加Feign依赖

    org.springframework.cloud
    spring-cloud-starter-openfeign

  1. 在启动类上添加注解
@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {…}
  1. 定义Http请求API,基于此API借助OpenFeign访问远端服务,代码如下:
package com.jt.consumer.service;
@FeignClient(name="sca-provider")//sca-provider为服务提供者名称
public interface RemoteProviderService{
    @GetMapping("/provider/echo/{string}")//前提是远端需要有这个服务
    public String echoMessage(@PathVariable("string") String string);
}
  1. 创建FeignConsumerController中并添加feign访问,如下:
package com.jt.consumer.controller;
@RestController
@RequestMapping("/consumer/ ")
public class FeignConsumerController {
    @Autowired
    private RemoteProviderService remoteProviderService;
    
    @GetMapping("/echo/{msg}")
    public String doFeignEcho(@PathVariable  String msg){
        //基于feign方式进行远端服务调用(前提是服务必须存在)
        return remoteProviderService.echoMessage(msg);
    }
}
  1. 启动消费者服务,在浏览器中直接通过feign客户端进行访问,如图所示(反复刷新检测其响应结果)
http://localhost:8090/consumer/echo/8090

(1). 失败回调机制
  1. 远程服务回调工厂,定义远端回调接口

  2. 实现FallbackFactory接口(Feign提供的),泛型就是我们字节定义的回调接口

  3. 在配置文件application.yml中添加如下配置,启动feign方式调用时的服务中断处理机制.

feign:  
  hystrix:
    enabled: true #默认值为false
  1. 在服务提供方对应的调用方法中添加Thread.sleep(500000)模拟耗时操作,然后启动服务进行访问测试.
一. 配置中心 1.IDEA连接数据库
  1. 选择数据库
  2. 填加相关信息,并下载驱动
  3. 选择nacos_config数据库

    **注意:**如果右侧没有三个点,可以右击:Database Tools - Manage Shown Schemas -
    再选对应数据库即可
2.创建日志对象
  1. 创建日志对象类
package com.jt.provider.controller;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

//@Slf4j
@RestController
public class ProviderLogController {
    //创建一个日志对象
    //org.slf4j.Logger (Java中的日志API规范,基于这个规范有Log4J,Logback等日志库)
    //org.slf4j.LoggerFactory
    //log对象在哪个类中创建,getLogger方法中的就传入哪个类的字节码对象
    //记住:以后只要Java中使用日志对象,你就采用下面之中方式创建即可.
    //假如在log对象所在的类上使用了@Slf4j注解,log不再需要我们手动创建,lombok会帮我们创建
   private static Logger log=
           LoggerFactory.getLogger(ProviderLogController.class);
    @GetMapping("/provider/log/doLog01")
    public String doLog01(){//trace 
3.添加依赖 
  1. 添加配置中心依赖,在provider工程中
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

添加以后,这些类就可以从nacos配置中心读取配置信息

4.修改配置文件
  1. 将项目sca-provider的application.yml的名字修改为bootstrap.yml(启动优先级最高),并添加配置中心配置
spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml # Configure the data format of the content, default to properties
5.新建nacos配置

6.启动服务,访问即可

7.日志级别显示在浏览器


**注意:**在此类上加注解:@RefreshScope 可以实现动态读取级别,不用重构对象

* 配置IDEA启动nacos
  1. 为了方便启动nacos,(可不配)

    配置好后在IDEA启动即可,操作台在IDEA中和cmd一样
二.Nacos配置管理模型 1.命名空间
  1. 创建新命名空间
  2. 在指定命名空间下添加配置,也可以直接取配置列表中克隆
  3. 此时修改dev命名空间中Data Id的sca-provider配置
2.修改配置文件
  1. 修改项目provider中的配置文件bootstrap.yml,添加如下配置
namespace: 00c9600a-73c7-47be-920c-74d8bf195a45 #默认命名空间为public
3.新建分组
  1. 在新建配置时指定分组名称
  2. 修改boostrap.yml配置类,在其内部指定我们刚刚创建的分组
server:
  port: 8081
spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      discovery: #假如nacos和你的服务在一台电脑上
        server-addr: localhost:8848 #默认向本机的nacos进行注册,这个地址可以不配置
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yml  #定义配置中心配置的格式
        namespace: 00c9600a-73c7-47be-920c-74d8bf195a45 #默认命名空间为public
        group: DEFAULT_GROUP_51
        shared-configs[0]:
          data-id: app-public.yml #这个名字为nacos中指定命名空间的一个dataId
          refresh: true #配置中心内容发生变化,是否支持动态刷新
4.新建Controller测试
  1. 测试是否启用本地缓存的配置
package com.jt.provider.controller;

@RefreshScope
@RestController
public class ProviderCacheController {
    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/provider/cache01")
    public String doUseLocalCache01(){
        return "useLocalCache'value is   "+useLocalCache;
    }
  1. 访问测试
* 共享配置设计及读取
  1. 在nacos中创建一个共享配置文件

    **提示:**其中,这里的secret可以理解为一个密钥。后期单点登录也用到这种设计
  2. 在指定的微服务配置文件(bootstrap.yml)中设置对共享配置文件的读取
spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        # 命名空间
        namespace: 83ed55a5-1dd9-4b84-a5fe-a734e4a6ec6d
        # 分组名
        # group: DEFAULT_GROUP
        # 配置中心文件扩展名
        file-extension: yml
        # 共享配置
        shared-configs[0]:
                data-id: app-public.yml
                refresh: true #默认false,共享配置更新,引用此配置的地方是否要更新
  1. 在指定的Controller类中读取和应用共享配置即可
package com.jt.provider.controller;

@RefreshScope
@RestController
public class ProviderSecretController {
    @Value("${app.secret:123456}")
    private String secret;
    @GetMapping("/provider/secret")
    public String doGetSecret(){
        //return String.format()
        return "The Secret is "+secret;
    }
}

**提示:**共享配置的读取.
* 1)为什么会有共享配置?(很多配置中有一些共性)
* 2)共享配置在配置文件中的一种引用方式 share-configs[0]:
4. 启动服务,然后打开浏览器进行访问测试读取共享配置

本章结束!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356120.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号