天天看点

一、SpringCloud框架搭建之Nacos服务注册与发现

SpringCloud大盘餐之Nacos

    • 一、Spring Cloud介绍
    • 二、Nacos搭建思路
      • 一、实现步骤
      • 二、安装Nacos服务
      • 三、集成Springboot、nacos
      • 四、Nacos服务注册与发现
      • 五、OpenFeign、RestTemplate消费服务
    • 三、参考项目源码

一、Spring Cloud介绍

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

二、Nacos搭建思路

一、实现步骤

  1. 准备环境(windows、linux)、安装nacos
  2. 集成Springboot、nacos
  3. Nacos服务注册与发现
  4. Nacos集成OpenFeign、RestTemplate消费
  5. Nacos配置中心

二、安装Nacos服务

本次使用Nacos版本为1.4.0

下载地址:https://github.com/alibaba/nacos/releases/tag/1.4.0

一、SpringCloud框架搭建之Nacos服务注册与发现

点击“nacos-server-1.4.0.tar.gz”下载,并传到linux的/usr/local/nacos目录下。

#解压缩安装包
tar -xzvf nacos-server-1.4.0.tar.gz
#进入到bin目录下
cd /usr/local/nacos/bin/
#启动nacos,这里暂时以单机方式启动,后面有机会再走集群
sh startup.sh -m standalone
           

访问 http://你的服务器ip:8848/nacos 会进入到nacos管理平台

默认账号:nacos

默认密码:nacos

三、集成Springboot、nacos

通过idea创建SpringBoot项目后,父级pom配置

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.11.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.cloud</groupId>
	<artifactId>cloud-demo</artifactId>
	<version>1.0</version>
	<name>cloud-demo</name>
	<packaging>pom</packaging>
	<description>Demo project for Spring Boot</description>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring.cloud-version>Hoxton.SR5</spring.cloud-version>
	</properties>

	<modules>
		<module>producer</module>
	</modules>

	<dependencyManagement>
		<dependencies>
			<!-- springCloud -->
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring.cloud-version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>

			<!-- springcloud alibaba -->
			<dependency>
				<groupId>com.alibaba.cloud</groupId>
				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
				<version>2.0.0.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>

		</dependencies>
	</dependencyManagement>

	<dependencies>
		<!-- springBoot -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<!-- web -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<version>2.0.4.RELEASE</version>
		</dependency>
        <!-- json -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.47</version>
		</dependency>

	</dependencies>
</project>
           

字模块pom.xml

<parent>
        <groupId>com.cloud</groupId>
        <artifactId>cloud-demo</artifactId>
        <version>1.0</version>
    </parent>

    <groupId>com.cloud</groupId>
    <artifactId>producer</artifactId>
    <version>1.0</version>
    <name>producer</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

    </dependencies>
           

四、Nacos服务注册与发现

以上maven依赖引用完成,下面看yml:

server:
  port: 8001
spring:
  application:
    name: producer   #注册的服务应用名
  cloud:
    nacos:
      discovery:
        server-addr: xx.xx.xxx.xx:8848   #代表你的nacos服务器和nacos服务端口
           

下面看代码:

@RestController
@RequestMapping("/producer")
public class ProducerController {

    /**
     * post形式的方法
     * @param name
     * @return
     */
    @PostMapping("/postDetail")
    public String postDetail(@RequestParam String name){
        return "postDetail方法入参:"+name;
    }

    /**
     * get形式的方法
     * @param name
     * @return
     */
    @GetMapping("/getDetail")
    public String getDetail(@RequestParam String name){
        return "getDetail方法入参:"+name;
    }

}
           

启动类:

@SpringBootApplication(scanBasePackages = "com.cloud")
@EnableDiscoveryClient
public class ProducerApplication {

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

}
           

运行ProducerApplication.java后,返回Nacos平台查看:

一、SpringCloud框架搭建之Nacos服务注册与发现

自己的服务已经注册进来。

五、OpenFeign、RestTemplate消费服务

子模块pom.xml

<parent>
        <groupId>com.cloud</groupId>
        <artifactId>cloud-demo</artifactId>
        <version>1.0</version>
    </parent>
    <groupId>com.cloud</groupId>
    <artifactId>consumer</artifactId>
    <version>1.0</version>
    <name>consumer</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <!-- discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- openFeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
           

yml配置文件

server:
  port: 8002
spring:
  application:
    name: consumer  #应用名
  cloud:
    nacos:
      discovery:
        server-addr: xx.xx.xxx.xx:8848   #nacos服务地址和端口
           

1. OpenFeign形式消费服务

下面看openFeign的代码:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @Author wangy
 * @create 2021/6/16 10:20
 * @Description RPC方式调用
 */
@FeignClient(name = "producer")
public interface IProducerService {
    /**
     * post形式的方法 调用接口跟直接调用方法一样便利无感知
     * @param name
     * @return
     */
    @PostMapping("/producer/postDetail")
    public String postDetail(@RequestParam String name);

    /**
     * get形式的方法 调用接口跟直接调用方法一样便利无感知
     * @param name
     * @return
     */
    @GetMapping("/producer/getDetail")
    public String getDetail(@RequestParam String name);
}
           

Controller代码:

@RestController
@RequestMapping("/openFeignConsumer")
public class OpenFeignConsumerController {

    @Autowired
    private IProducerService producerService;

    /**
     * openFeign形式调用 producer接口
     * @param name
     * @return
     */
    @PostMapping("/postDetail")
    public String postDetail(@RequestParam String name){
        return producerService.postDetail(name);
    }

    /**
     * openFeign形式调用 producer接口
     * @param name
     * @return
     */
    @GetMapping("/getDetail")
    public String getDetail(@RequestParam String name){
        return producerService.getDetail(name);
    }

}
           

启动类:

@SpringBootApplication(scanBasePackages = "com.cloud")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.cloud.consumer.service")
public class ConsumerApplication {

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

}
           

上面注意,使用OpenFeign的话,一定要注意扫描包路径要配置上

@EnableFeignClients(basePackages = “com.cloud.consumer.service”)

不加则会找不到注入的类

通过OpenFeign方式调用接口,跟直接调用方法一样便利,高效。

2. RestTemplate形式消费服务

首先创建配置类:

@Configuration
public class RestTemplateConfiguration {
    
    /**
     * 使restTemplate具有负载均衡作用
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
           

然后Controller类调用接口:

/**
 * @Author wangy
 * @create 2021/6/15 9:56
 * @Description   openFeign形式调用 producer接口
 */
@RestController
@RequestMapping("/restTemplateConsumer")
public class RestTemplateConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * restTemplate形式调用 producer接口和传值
     * @param name
     * @return
     */
    @PostMapping("/postDetail")
    public String postDetail(@RequestParam String name){
        //post形式必须用MultiValueMap接口实现类来传值
        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
        //map的put的值是list
        paramMap.put("name", Arrays.asList(name));
        //url解析: producer为服务提供者的application.name 后面跟接口请求路径
        return restTemplate.postForObject("http://producer/producer/postDetail", paramMap, String.class);
    }

    /**
     * restTemplate形式调用 producer接口和传值
     * @param name
     * @return
     */
    @GetMapping("/getDetail")
    public String getDetail(@RequestParam String name){
        //get方法使用map来传值,url中使用占位符来跟map的key想对应
        Map map = new HashMap();
        map.put("name",name);
        //url解析: producer为服务提供者的application.name 后面跟接口请求路径
        return restTemplate.getForObject("http://producer/producer/getDetail?name={name}", String.class, map);
    }

}
           

三、参考项目源码

当前项目源码地址:

https://gitee.com/wangyue123com_admin/cloud-demo.git

分支为:Nacos-discovery