搭建SpringCloud微服务框架:二、SpringCloud服务注册与发现
搭建微服务框架(SC服务注册与发现)
Github地址:SQuid
服务注册中心-Nacos
Nacos是阿里开源的一款注册中心中间件,详细介绍可以访问Nacos官网,本次框架是基于Nacos做的注册。
安装Nacos我们可以使用Docker,Docker可以很快的安装好Nacos并且启动。
而在本项目中,引入的Nacos两个依赖分别如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
完成对Nacos的依赖引入后,可以进行下一步的SpringCloud服务发布的操作,👇。
SpringCloud服务发布
我们新建俩个Maven模块项目,用它来实现服务提供者的角色。
如上,分别以 squid-example-api
和 squid-example-provider
命名。
- squid-example-api
squid-example-api
项目中主要是写一些接口文件,将这些接口对外注册并且暴露出去,引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
新建一个 HiService
的接口,并且注明 @FeignClient("squid-example-sc-provider")
,注解内名称可以为项目名:
@FeignClient("squid-example-sc-provider")
public interface HiService {
@RequestMapping(value = "/hi", method = RequestMethod.GET)
public String hi(@RequestParam("msg") String msg);
}
PS:这里是为了明确各个模块,所以将 squid-example-api
和 squid-example-provider
进行分离,也可以将两个模块合并。
- squid-example-provider
然后我们依旧是在 squid-example-provider
引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.yanzhenyidai</groupId>
<artifactId>squid-example-sc-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
引入 spring-cloud-start-openfeign
是将服务以 Http Restful
的形式进行对外发布(SC的服务基本上都是以Http Restful的形式,
可以了解一下 Dubbo或者其他RPC的服务注册,也可以看一下 RPC和HTTP),而 spring-boot-starter-web
则是表明该项目需要以Web的形式进行启动,
不难理解,毕竟HTTP请求是有需要一个Web容器来进行。
一切准备就绪后,我们就可以开始来编写服务实现和启动服务类了。
在项目中最外层的包路径中新建一个 Application
的启动类,这点原因熟悉Spring加载逻辑的同学应该都明白,Spring启动扫描时是向下扫描,也就是加载包路径以下的
代码配置:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@RestController
public class ScProviderApplication {
@Autowired
private HiService hiService;
public static void main(String[] args) {
SpringApplication.run(ScProviderApplication.class, args);
}
@GetMapping(value = "/hi")
public String hi(String msg) {
return hiService.hi(msg);
}
}
继续编写一个 HiService
的实现 HiServiceImpl
:
@Service
public class HiServiceImpl implements HiService {
@Override
public String hi(String msg) {
return "hi sc," + msg;
}
}
贴一下 application.yaml
文件信息:
spring:
application:
name: squid-example-sc-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
discovery:
client:
health-indicator:
enabled: false
server:
port: 8084
ribbon:
ReadTimeout: 100000
ConnectTimeout: 100000
接下来就可以在 Application
类中直接启动了。
没有报错的话,可以访问以下路径 localhost:8084/hi?msg=Hi,以检验服务是否发布成功。
也可以在Nacos控制台中直观的找到该服务的信息:
一切都OK了,继续下一步👇。
SpringCloud服务订阅
服务可以正常注册之后,我们来新建一个工程模拟消费者进行请求,如下图:
新建的工程我们以 squid-example-consumer
来命名,来对应 squid-example-provider
的意思。
照样,我们需要引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.yanzhenyidai</groupId>
<artifactId>squid-example-sc-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
依赖与 squid-example-provider
一致,紧接着,我们可以来编写调用 squid-example-provider
对外暴露的 HiService
接口,同样新建一个 Application
的启动类:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@RestController
public class ScConsumerApplication {
@Autowired
private HiService hiService;
@GetMapping(value = "/hi")
public String hi(String msg) {
return hiService.hi(msg);
}
public static void main(String[] args) {
SpringApplication.run(ScConsumerApplication.class, args);
}
}
application.yaml
文件:
spring:
application:
name: squid-example-sc-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
discovery:
client:
health-indicator:
enabled: false
server:
port: 8085
ribbon:
ReadTimeout: 100000
ConnectTimeout: 100000
启动 squid-example-consumer
的 Application
后,我们可以访问 localhost:8085/hi?msg=Hi
来进行验证,此时如果先打端点在 squid-example-provider
的 HiServiceImpl
方法实现上,可以看到程序进入到了该断点。
虽然本意上 squid-example-consumber
工程是多此一举,毕竟现在项目大多都是前后端分离,不过通过这个消费工程也可以明白到Nacos是怎么做到的服务发现,以及如果内部服务需要相互调用,也可以这样进行。
PS:Nacos的服务发现:
上图是Nacos官网的基础机构及概念图,大致看上去逻辑和Zookeeper的调用机制类似。服务先将关键信息注册到Nacos,调用时根据协议再去请求各个服务。这里不做多提,感兴趣可以下Zookeeper服务注册和发现。
总结
SpringCloud作为近期很火的微服务框架,本篇记录的是个人搭建SpringCloud服务的一些记录,感谢您的阅读,希望能帮助到你,如果有遇到问题,可以发送邮件到frank-tan@outlook.com。
参考资料: