SpringCloud大盘餐之Nacos
一、Spring Cloud介绍
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
二、Nacos搭建思路
一、实现步骤
- 准备环境(windows、linux)、安装nacos
- 集成Springboot、nacos
- Nacos服务注册与发现
- Nacos集成OpenFeign、RestTemplate消费
- Nacos配置中心
二、安装Nacos服务
本次使用Nacos版本为1.4.0
下载地址:https://github.com/alibaba/nacos/releases/tag/1.4.0
点击“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平台查看:
自己的服务已经注册进来。
五、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