简单说明
spring-cloud-alibaba的服务注册发现中心是阿里巴巴自研并开源的nacos,所以使用spring-cloud-alibaba时,不再自己搭建服务注册发现中心,直接使用nacos即可。具体如何安装nacos,请在nacos官网的快速开始栏目学习(我这太辣鸡电脑其他网站都打开,就是打不开nacos官网,要不然给截个图了,哭死。)nacos安装完成后,启动,在浏览器访问http://[IP]:8848/nacos可进入控制台,默认的账号密码:nacos
搭建环境
开发工具:IDEA
JDK : jdk1.8
项目构建:maven3.6
一.新建一个SpringBoot项目
新建过程中修改一个点,如下图:
其他的照旧,搭建完成后,如下图:
在pom.xml中添加
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
完整的pom.xml如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>server_provider</module>
<module>server_consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.myc</groupId>
<artifactId>spring-cloud-alibaba-demo2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-alibaba-demo2</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这就是项目基础框架,以后的模块都在这个项目基础上增加。
新增服务提供模块
在基础项目上右键->new->module,选择一个maven项目,如下图:
按照常规流程创建maven项目。创建完成后结果如下图:
pom.xml中需要增加一个依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
完整的pom.xml如下:
<?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>spring-cloud-alibaba-demo2</artifactId>
<groupId>com.myc</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<description>这是一个服务提供方,别的服务要调用我这里提供的一些服务</description>
<artifactId>server_provider</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
然后在java包下创建一个项目启动类,再创建一个controller入口类。
在resourece下创建application.yml文件(也可以是applicaiton.properties,看个人喜好),结构与内容如下:
application.yml如下:
server:
port: 9000
spring:
application:
name: server-provider # 服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 这里配置nacos的服务地址
ServerProviderApp.java如下:
package com.myc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author mayc
* @description:
* @date 2019/8/14 0014 下午 2:52
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ServerProviderApp {
public static void main(String[] args) {
SpringApplication.run(ServerProviderApp.class, args);
}
}
HelloController.java代码如下:
package com.myc.controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author mayc
* @description:
* @date 2019/8/14 0014 下午 2:55
*/
@RestController
public class HelloController {
@RequestMapping("/hello/{msg}")
public String hello(@PathVariable String msg) {
return msg + "进来了!请坐请坐";
}
}
到这一步,第一个服务提供者基本完成,启动该模块,然后打开nacos控制台,查看服务是否已经注册到nacos,
我们看到我们的服务已经注册到nacos。
创建服务消费方
跟创建服务提供方一样的步骤,创建一个模块,作为服务提供方,创建完成后的结构如下图:
由于服务消费方需要调用其他服务,而调用服务有多种方式,本次学习使用是restTemplate和springCloud提供的Feign方式。贴出各个文件的代码如下
pom.xml
<?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>spring-cloud-alibaba-demo2</artifactId>
<groupId>com.myc</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<description>这是服务消费方</description>
<artifactId>server_consumer</artifactId>
<properties>
<spring-cloud-starter-openfeign.version>2.1.2.RELEASE</spring-cloud-starter-openfeign.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud-starter-openfeign.version}</version>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 9001
spring:
application:
name: server-consumer #服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848
ServerConsumerApp.java
package com.myc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @author mayc
* @description:
* @date 2019/8/14 0014 下午 2:58
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServerConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ServerConsumerApp.class, args);
}
//添加 @LoadBlanced 注解,使得 RestTemplate 接入 Ribbon,这样就能够实现负载均衡
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
HelloService
package com.myc.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*使用 @FeignClient 注解将 HelloService 这个接口包装成一个 FeignClient,
* 属性 name 对应服务提供方的服务名 server-provider。
*
* hello 方法上的 @RequestMapping 注解将 hello 方法与 URL "/hello/{msg}" 相对应,
* @PathVariable 注解将 URL 路径中的 {msg} 对应成 hello 方法的参数 msg
*/
@FeignClient(name = "server-provider")
public interface HelloService {
@RequestMapping("/hello/{msg}")
String hello(@PathVariable("msg") String msg);
}
HelloController.java
package com.myc.controller;
import com.myc.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @author mayc
* @description:
* @date 2019/8/14 0014 下午 3:01
*/
@RestController
public class HelloController {
public static final String SERVER_PROVIDER_NAME = "server-provider";
@Autowired(required = true)
private HelloService helloService;
@Autowired
private RestTemplate restTemplate;
/**
* 通过restTemplate方式消费服务
* @param msg
* @return
*/
@RequestMapping("hello-rest/{msg}")
public String restHello(@PathVariable("msg") String msg) {
String msg1 = msg + ",你好";
return restTemplate.getForObject("http://" + SERVER_PROVIDER_NAME + "/hello/" + msg1, String.class);
}
/**
* 通过feign方式消费服务
* @param msg
* @return
*/
@RequestMapping("hello-feign/{msg}")
public String feignHello(@PathVariable("msg") String msg) {
String msg2 = msg + ", 我也好";
return helloService.hello(msg2);
}
}
第二个服务也创建完成。启动该服务,到nacos控制台查看,是否存在该服务。
测试服务是否可以调用
打开浏览器,访问http://localhost:9001/hello-rest/我叫abc,结果:
访问http://localhost:9001/hell-feign/我叫abc,结果:
至此,基于spring-cloud-alibaba和nacos的服务注册发现基本弯完成。
文章基于spring-cloud-alibaba在github的说明文档进行的学习,如有错误,请指正。