【微服务】Nacos(注册中心)

文章目录

1.基本介绍

1.概述
2.Nacos下载和运行(java8/maven3.2.x+)
1.解压到没有中文路径的
2.双击startup
3.浏览器输入http://192.168.242.124:8848/nacos
4.用户名和密码为nacos
5.cmd输入netstat -anb | more查看监听端口

2.创建Nacos服务提供者 10004

1.项目架构
2.步骤说明
3.创建模块 member-service-nacos-provider-10004 作为服务提供者
4.父项目pom.xml指定依赖版本
5.本模块pom.xml 引入依赖,nacos的服务发现
xml 复制代码
    <dependencies>
        <!--引入nacos的服务发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- springboot web starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 如果在子工程/模块指定了 version,则以指定为准 -->
        </dependency>
        <!--
        1. starter-actuator 是 springboot 程序的监控系统,可以实现健康检查,info 信息
        等
        2. 访问 http://localhost:10000/actuator 可以看到相关链接, 还可以做相关设置. -->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <!-- 这里我们重新指定一下 version 因为父项目中没有对这个依赖进行版本仲裁-->
            <version>1.1.13</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- jdbc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 公共模块的jar包 -->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

    </dependencies>
6.参考10001模块来构建
1.到10001模块复制main目录下的所有文件夹
2.粘贴到10004模块的main目录下
3.修改application.yml,并注册到nacos
yaml 复制代码
server:
  port: 10004 # 配置服务端口
spring:
  application:
    name: member-service-nacos-provider-10004 # 配置服务的名称,名字任意这里与项目名保持一致
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    # 别忘记创建数据库之后修改数据库名称
    url: 
    username: 
    password: 
# 配置naocs
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置nacos的地址
# 暴露所有的监控点
management:
  endpoints:
    web:
      exposure:
        include: "*"
mybatis:
  mapper-locations: classpath:mapper/*.xml # 扫描所有Mapper.xml
  type-aliases-package: com.sun.springcloud.entity # 扫描所有实体类,可以直接使用类名来标识
4.重新创建主启动类,开启nacos服务发现
java 复制代码
package com.sun.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author 孙显圣
 * @version 1.0
 */
@SpringBootApplication
@EnableDiscoveryClient // 开启nacos服务发现
public class MemberNacosProviderApplication10004 {
    public static void main(String[] args) {
        SpringApplication.run(MemberNacosProviderApplication10004.class, args);
    }
}
5.修改controller,更好的显示信息
7.测试
1.确保启动了nacos(startup)
2.启动10004微服务模块,http://localhost:8848/nacos 查看注册情况
3.浏览器测试这个服务提供者

3.创建Nacos服务提供者集群 10006

1.创建与10004模块功能相同的子模块 member-service-nacos-provider-10006
2.pom.xml 将10004模块的依赖复制过来
xml 复制代码
    <dependencies>
        <!--引入nacos 的服务发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- springboot web starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 如果在子工程/模块指定了 version,则以指定为准 -->
        </dependency>
        <!--
        1. starter-actuator 是 springboot 程序的监控系统,可以实现健康检查,info 信息
        等
        2. 访问 http://localhost:10000/actuator 可以看到相关链接, 还可以做相关设置. -->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <!-- 这里我们重新指定一下 version 因为父项目中没有对这个依赖进行版本仲裁-->
            <version>1.1.13</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- jdbc -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 公共模块的jar包 -->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
3.复制10004模块的main目录下的文件夹并粘贴到10006
4.修改application.yml的服务端口和服务名称
yaml 复制代码
server:
  port: 10006 # 配置服务端口
spring:6
  application:
    name: member-service-nacos-provider # 配置服务的名称
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    # 别忘记创建数据库之后修改数据库名称
    url:
    username: 
    password: 
# 配置naocs
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置nacos的地址
# 暴露所有的监控点
management:
  endpoints:
    web:
      exposure:
        include: "*"
mybatis:
  mapper-locations: classpath:mapper/*.xml # 扫描所有Mapper.xml
  type-aliases-package: com.sun.springcloud.entity # 扫描所有实体类,可以直接使用类名来标识
5.修改10004模块的服务名称
  • 因为两个模块的功能是相同的,只是做成了一个集群,所以名字需要相同
6.修改主启动类的名称
7.修改controller,显示信息
8.测试
1.首先保证nacos8848是启动的
2.启动10006和10004微服务
3.浏览器输入 http://localhost:8848/nacos/ 查看注册状态
4.postman测试

4.创建nacos服务消费方

1.架构图
2.创建服务消费模块 member-service-nacos-consumer-81
3.pom.xml 引入依赖,主要是nacos的服务发现依赖
xml 复制代码
    <dependencies>
        <!--引入nacos的服务发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- springboot web starter 用来监听端口-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 如果在子工程/模块指定了 version,则以指定为准 -->
        </dependency>
        <!--
        1. starter-actuator 是 springboot 程序的监控系统,可以实现健康检查,info 信息
        等
        2. 访问 http://localhost:10000/actuator 可以看到相关链接, 还可以做相关设置. -->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 公共模块的jar包 -->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

    </dependencies>
4.application.yml 配置nacos的服务注册
yaml 复制代码
server:
  port: 81
spring:
  application:
    name: member-service-nacos-consumer-81
# 配置nacos的服务注册
  cloud:
      nacos:
        discovery:
          server-addr: localhost:8848 # 配置要注册到的nacos地址,根据实际情况填写
5.编写启动类,开启nacos服务发现
java 复制代码
package com.sun.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author 孙显圣
 * @version 1.0
 */
@SpringBootApplication // springboot启动类
@EnableDiscoveryClient // 开启nacos服务发现
public class MemberNacosCostomerApplication81 {
    public static void main(String[] args) {
        SpringApplication.run(MemberNacosCostomerApplication81.class, args);
    }
}
6.com/sun/springcloud/config/CustomizationBean.java 配置类注入RestTemplate,并且赋予负载均衡的能力
java 复制代码
package com.sun.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * 配置类注入RestTemplate,并且赋予负载均衡的能力
 *
 * @author 孙显圣
 * @version 1.0
 */
@Configuration // 标识这是一个配置类
public class CustomizationBean {
    @Bean
    @LoadBalanced // 赋予RestTemplate负载均衡的能力
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
7.使用RestTemplate进行远程调用的流程
  • pom.xml 配置nacos的服务发现依赖
  • application.yml 配置nacos的服务注册
  • 启动类开启nacos的服务发现
  • 配置类配置RestTemplate和负载均衡算法
  • 编写远程调用的controller
    • 复制要调用controller上面的注解
    • 注入RestTemplate 用作远程调用
    • 获取要远程调用的 application name
    • 根据 application name声明服务发现的前缀http://application name (这个可以找到远程调用的上下文路径)
    • 服务发现(使用声明的服务发现前缀) + 目标接口路径 进行拼接即可访问目标接口,Ribbon负载均衡算法
    • 使用RestTemplate进行远程调用
8.编写controller进行远程调用(详细步骤)
1.获取两个服务的名字 member-service-nacos-provider
2.com/sun/springcloud/controller/MemberNacosConsumerController.java
1.controller类的注解跟要远程调用的注解保持一致
2.依赖注入RestTemplate进行远程调用
3.声明服务发现的前缀
  • 这里需要注意:服务发现的只是ip+端口+上下文路径,并不包括协议
4.先将要调用的方法直接粘贴过来,删除方法体
5.使用RestTemplate进行远程调用
6.可以修改请求这个方法的url(其实也只有这个地方才可以修改了,其他的直接粘贴即可)
7.完整源代码
java 复制代码
package com.sun.springcloud.controller;

import com.sun.springcloud.entity.Member;
import com.sun.springcloud.util.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @author 孙显圣
 * @version 1.0
 * @Description: 远程调用MemberController的控制器
 */
@RestController // controller注解跟要调用的服务的controller一样
@Slf4j
public class MemberNacosConsumerController {
    // 注入restTemplate 进行远程调用
    @Resource
    private RestTemplate restTemplate;

    // 声明服务发现的前缀
    // 服务发现的的是ip+端口+上下文路径
    public static final String MEMBER_SERVICE_PROVIDER_URL = "http://member-service-nacos-provider";

    // 远程调用MemberController的save方法
    @PostMapping("/member/nacos/consumer/save")
    public Result save(@RequestBody Member member) {
        // 远程调用member-service-nacos-provider的save方法
        return restTemplate.postForObject(MEMBER_SERVICE_PROVIDER_URL + "/member/save", member, Result.class);
    }

}
8.增加远程调用
  • 直接将要调用的方法粘贴过来,然后使用copliot直接tab即可
  • 如果想修改,就修改一下url
java 复制代码
    @GetMapping("/member/nacos/consumer/get/{id}") // 这里使用的路径参数
    public Result getMemberById(@PathVariable("id") Long id) {
        // 远程调用member-service-nacos-provider的getMemberById方法
        return restTemplate.getForObject(MEMBER_SERVICE_PROVIDER_URL + "/member/get/" + id, Result.class);
    }
9.测试
1.启动两个服务提供集群10004和10006以及刚才的服务消费方81模块
2. 查看服务注册情况

浏览器输入:http://192.168.242.124:8848/nacos/index.html

3.postman测试服务消费方的远程调用

5.Ribbon配置负载均衡算法

1.com/sun/springcloud/config/RibbonRule.java 配置类直接注入一个负载均衡算法对象
java 复制代码
package com.sun.springcloud.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/** 配置类,用于配置Ribbon的负载均衡策略
 * @author 孙显圣
 * @version 1.0
 */
@Configuration
public class RibbonRule {
    @Bean
    public IRule ribbonRule() {
        // 随机策略
        return new RandomRule();
    }
}
相关推荐
憨子周34 分钟前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
FIN技术铺2 小时前
Redis集群模式之Redis Sentinel vs. Redis Cluster
数据库·redis·sentinel
霖雨2 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404192 小时前
javaSE面试题
java·开发语言·面试
Fiercezm3 小时前
JUC学习
java
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
我不是星海3 小时前
1.集合体系补充(1)
java·数据结构
P.H. Infinity3 小时前
【RabbitMQ】07-业务幂等处理
java·rabbitmq·java-rabbitmq
爱吃土豆的程序员3 小时前
java XMLStreamConstants.CDATA 无法识别 <![CDATA[]]>
xml·java·cdata