微服务 - nacos

wuchangjian2021-10-28 20:09:45编程学习

这里写目录标题

  • 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

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. 添加服务注册和发现依赖
 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
  1. 添加SpringBoot-web依赖
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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;
    /**定义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.创建consumer工程类

  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-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>
  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;
/**
 * 定义服务消费端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);
    }
}
  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依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  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;
    /**基于feign方式的服务调用*/
    @GetMapping("/echo/{msg}")
    public String doFeignEcho(@PathVariable  String msg){
        //基于feign方式进行远端服务调用(前提是服务必须存在)
        return remoteProviderService.echoMessage(msg);
    }
}
  1. 启动消费者服务,在浏览器中直接通过feign客户端进行访问,如图所示(反复刷新检测其响应结果)
http://localhost:8090/consumer/echo/8090

在这里插入图片描述

相关文章

创新湖南湘阴论道,院士专家为湘阴创新发展赋能

2022-08-17 14:52:49 8月17日,创新湖南高峰论坛暨...

第25章:阅读理解MRC模型集成、蒸馏、部署及源码实现

1,模型集成ensemble有效性背后的Bayesian数学原理深度剖...

Java加密程序

package mypack; import java.util.*; /** &...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。