2019-12-15 Spring Cloud微服务从入门到入土
启动Nacos
下载地址:https://github.com/alibaba/nacos/releases
解压后使用以下命令启动:
sh nacos/bin/startup.sh -m standalone
其中standalone
表示以单机模式运行,具体可以参考文档。
启动后访问127.0.0.1:8848
,默认用户名和密码都是nacos,登录后就可以看到Nacos控制台了。
创建服务提供者
有了注册中心,我们现在就可以创建服务提供者了。
由于我们使用Dubbo
作为RPC框架,服务风格也是对内RPC对外RESTful,所以在这里直接整合Dubbo
。
创建一个新的module
,名为wendev-provider
。
创建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>wendev-microservice</artifactId>
<groupId>site.wendev.microservice</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>wendev-provider</artifactId>
<dependencies>
<dependency>
<groupId>site.wendev.microservice</groupId>
<artifactId>wendev-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-devtools</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.springframework</groupId>-->
<!-- <artifactId>springloaded</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!-- End Spring Boot -->
<!-- ZipKin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!-- Nacos Discovery -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Netty -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
</dependencies>
</project>
其中引入了我们上一篇文章中所讲的公共API模块。
公共API的编写
在wendev-api
模块中创建一个包site.wendev.microservice.api
,新建一个interface
:
HelloService.java
package site.wendev.microservice.api;
public interface HelloService {
String hello(String message);
}
这个就是我们的服务的公共API:根据用户输入的message返回一个字符串。
执行mvn install
将这个模块安装在本地,以供其他服务调用。
服务提供者的实现
在wendev-provider
项目下新建资源文件application.yml
:
server:
port: 8700
spring:
application:
name: wendev-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
datasource:
username: username
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/wendev?serverTimezone=UTC&characterEncoding=utf-8
zipkin:
base-url: http://127.0.0.1:9411
main:
allow-bean-definition-overriding: true
# 单点检查
management:
endpoints:
web:
exposure:
include: "*"
dubbo:
registry:
address: nacos://127.0.0.1:8848
scan:
base-packages: site.wendev.microservice.provider.service
protocol:
name: dubbo
port: -1
部分节点含义解释:
-
server.port
:服务运行的端口 -
spring.application.name
:服务名称,也就是服务在注册中心的名称,非常重要 -
spring.cloud.nacos.discovery.server-addr
:服务注册与发现中心(Nacos)的地址 -
spring.zipkin.base-url
:服务链路追踪(ZipKin)的地址。ZipKin的使用会在后续文章中讲解 -
spring.main.allow-bean-definition-overriding
:允许注解相同。不加会报错 -
dubbo.registry.address
:Nacos的地址 -
dubbo.scan.base-packages
:Dubbo注解扫描,在这里声明的包中含有@Service
注解的就会被扫描到 -
dubbo.protocol.name
:声明使用Dubbo协议 -
dubbo.protocol.port
:-1表示自增端口
在wendev-provider
下新建包site.wendev.microservice.provider.service
,创建一个Java文件,实现我们刚刚写的接口:
HelloServiceImpl.java
@Service
public class HelloServiceImpl implements HelloService {
@Value("${server.port}")
private String port;
@Override
public String hello(String message) {
return String.format("Welcome to WenDev, your message is %s, from the port %s. From Dubbo.",
message, port);
}
}
注意!这里这个@Service
注解不是Spring的,而是org.apache.dubbo.config.annotation.Service
。不要弄错了。
创建一个文件用来启动应用:
ServiceProviderApplication.java
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}
@EnableDiscoveryClient
表示开启服务注册与发现,这个与使用Eureka时是一样的。
启动项目,在Nacos中就可以发现服务的注册信息了:
因为我们整合了Dubbo,所以第一条注册信息是Dubbo产生的。
同时在启动时,也可以发现控制台中输出了如下信息:
2019-12-15 14:55:29.824 INFO [wendev-provider,,,] 7430 --- [ main] o.s.c.a.n.registry.NacosServiceRegistry : nacos registry, wendev-provider 10.13.111.47:8700 register finished
表明服务已经成功注册到Nacos中。
如果查看一下控制台输出的信息,也可以看到Dubbo初始化、扫描到我们刚刚写的@Service
注解和Dubbo注册到Nacos中的相关信息。
至此,我们的服务提供者就创建完成了。