Nacos - 服务发现(4.2)

4.7 实现 application1调用Service1

现在service1已暴露dubbo服务并注册到nacos中,下边实现application1调用service1

4.7.1 引用service1

下边在application1中引用service1
在pom.xml中引入service-1-api的依赖

<dependency>
<groupId>com.itheima.nacos</groupId>
<artifactId>service‐1‐api</artifactId>
<version>1.0‐SNAPSHOT</version>
</dependency>

引入 spring-cloud-starter-dubbo依赖,它会根据接口生成代理对象

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐starter‐dubbo</artifactId>
</dependency>
4.7.2 实现远程调用
@RestController
public class Application1Controller {
@org.apache.dubbo.config.annotation.Reference
private ConsumerService consumerService;
@GetMapping("/service")
public String service(){
return "test" + consumerService.service();
}
}

Note:注意:这里的 @Reference 注解是org.apache.dubbo.config.annotation.Reference
测试:
请求:http://localhost:56020/application1/service
consumerService正常生成代理对象,service1被调用。

4.8 实现 Service2

如上面设计所示,Service2需要暴露dubbo接口以供service1消费,若想在Spring cloud Alibaba中集成并使用dubbo。

4.8.1 定义父工程

定义service2父工程,pom.xml如下:

<parent>
<artifactId>nacos‐micro‐service</artifactId>
<groupId>com.itheima.nacos</groupId>
<version>1.0‐SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>Service2</artifactId>
4.8.2 定义service-2-api

定义service-2-api工程,pom.xml如下:

<parent>
<artifactId>Service2</artifactId>
<groupId>com.itheima.nacos</groupId>
<version>1.0‐SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service‐2‐api</artifactId>

并定义服务接口,Dubbo 服务接口是服务提供方与消费方的远程通讯契约,通常由普通的 Java 接口(interface)来声明,如 ProviderService 接口:

package com.itheima.microservice.service2.api;
public interface ProviderService {
String service();
}
4.8.3 实现service-2-server

(1)初始化 service-2-server Maven 工程
首先,创建 artifactId 名为 service-2-server 的 Maven 工程,并在其 pom.xml 文件中增添 Dubbo Spring Cloud 必要的依赖:

<parent>
<artifactId>Service2</artifactId>
<groupId>com.itheima.nacos</groupId>
<version>1.0‐SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service‐2‐server</artifactId>
<dependencies>
<dependency>
<groupId>com.itheima.nacos</groupId>
<artifactId>service‐2‐api</artifactId>
<version>1.0‐SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐starter‐dubbo</artifactId>
</dependency>
</dependencies>

以上依赖 artifact 说明如下:

  • service-2-api : 提供 ProviderService 接口的 artifact
  • spring-boot-starter-web : Spring Boot starter artifact ,间接引入 spring-boot artifact
  • spring-cloud-starter-dubbo : Dubbo Spring Cloud Starter artifact ,间接引入 dubbo-spring-bootstarter 等 artifact
  • spring-cloud-starter-alibaba-nacos-discovery : Nacos Spring Cloud 服务注册与发现 artifact
    (2)实现 Dubbo 服务
    ProviderService 作为暴露的 Dubbo 服务接口,服务提供方 service-2-server 需要将其实现:
package com.itheima.microservice.service2.service;
@org.apache.dubbo.config.annotation.Service
public class ProviderServiceImpl implements ProviderService {
@Override
public String service() {
return "Provider invoke";
}
}

其中, @org.apache.dubbo.config.annotation.Service 是 Dubbo 服务注解,仅声明该 Java 服务(本地)实现为 Dubbo 服务。 因此,下一步需要将其配置 Dubbo 服务(远程)。

(3)配置 Dubbo 服务
在暴露 Dubbo 服务方面,推荐开发人员外部化配置的方式,即指定 Java 服务实现类的扫描基准包。

Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注@DubboComponentScan 来实现基准包扫描。

同时,Dubbo 远程服务需要暴露网络端口,并设定通讯协议,完整的 YAML 配置如下所示:

server:
  port: ${port:56040} #启动端口 命令行注入
spring:
  application:
    name: service2
  main:
    allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要设定
  cloud:
    nacos:
      discovery:
        server‐addr: 127.0.0.1:8848
        namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4
        cluster‐name: DEFAULT
      config:
        server‐addr: 127.0.0.1:8848 # 配置中心地址
        file‐extension: yaml
        namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4 # 开发环境
        group: NACOS_MICROSERVICE_GROUP # xx业务组
dubbo:
  scan:
    # dubbo 服务扫描基准包
    base‐packages: com.itheima.microservice
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口( ‐1 表示自增端口,从 20880 开始)
    port: ${dubbo_port:20891}
  registry:
    address: nacos://127.0.0.1:8848
  application:
    qos‐enable: false
  consumer:
    check: false

(4)启动服务提供方应用
Dubbo Spring Cloud 引导类与普通 Spring Cloud 应用并无差别,如下所示:

@SpringBootApplication
@EnableDiscoveryClient
public class Service2Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service2Bootstrap.class, args);
}
}

在引导 Service2Bootstrap 之前,请提前启动 Nacos 服务器。 当 Service2Bootstrap 启动后,应用 service2将出现在 Nacos 控制台界面。

4.9 实现service1调用service2

4.9.1 引用service2

在service2中添加service1的依赖:

<dependency>
<groupId>com.itheima.nacos</groupId>
<artifactId>service‐2‐api</artifactId>
<version>1.0‐SNAPSHOT</version>
</dependency>
4.9.2 实现远程调用
@org.apache.dubbo.config.annotation.Service
public class ConsumerServiceImpl implements ConsumerService {
@Reference
ProviderService providerService;
public String service() {
return "Consumer invoke | "+providerService.service();
}
}

测试:
请求:http://localhost:56020/application1/service
application1调用service1,service1调用service2

4.10 实现api-gateway

4.10.1 Zuul介绍

什么是网关?
原来的单体架构,所有的服务都是本地的,UI可以直接调用,现在按功能拆分成独立的服务,跑在独立的一般都在独立的虚拟机上的 Java进程了。客户端UI如何访问?他的后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,前台就要重新部署,这明显不服务我们拆分的理念,特别当前台是移动应用的时候,通常业务变化的节奏更快。另外,N个小服务的调用也是一个不小的网络开销。


QQ截图20200103095421.png

有了网关作为服务统一入口,就可以避免上述问题,不仅如此,服务网关是在微服务前边设置一道屏障,请求先到服务网关,网关会对请求进行过虑、校验、路由等处理。有了服务网关可以提高微服务的安全性,网关校验请求的合法性,请求不合法将被拦截,拒绝访问。

  • 提供统一服务入口,让微服务对前台透明
  • 聚合后台的服务,节省流量,提升性能
  • 提供安全,过滤,流控等API管理功能

什么是Zuul?
Spring Cloud Zuul是整合Netflix公司的Zuul开源项目实现的微服务网关,它实现了请求路由、负载均衡、校验过虑等 功能。
官方:https://github.com/Netflix/zuul

Zuul与Nginx怎么配合使用?
Zuul与Nginx在实际项目中需要配合使用,如下图,Nginx的作用是反向代理、负载均衡,Zuul的作用是保障微服务的安全访问,拦截微服务请求,校验合法性及负载均衡。


QQ截图20200103095647.png
4.10.2 搭建网关工程

初始化 api-gateway Maven 工程

<parent>
<artifactId>nacos‐micro‐service</artifactId>
<groupId>com.itheima.nacos</groupId>
<version>1.0‐SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api‐gateway</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐netflix‐zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐openfeign</artifactId>
</dependency>
</dependencies>
4.10.3 api-gateway配置
server:
  port: 56010 #启动端口 命令行注入
spring:
  application:
    name: api‐gateway
  main:
    allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要设定
  cloud:
    nacos:
      discovery:
        server‐addr: 127.0.0.1:8848
        namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4
        cluster‐name: DEFAULT
      config:
        server‐addr: 127.0.0.1:8848 # 配置中心地址
        file‐extension: yaml
        namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4 # 开发环境
        group: NACOS_MICROSERVICE_GROUP # xx业务组

网关的路由配置采用nacos远程配置,在nacos控制台开发环境中新增api-gateway.yaml配置集,配置组为TEST_GROUP,配置内容如下:

zuul:
  routes:
    application1:
      stripPrefix: false
      path: /application1/**

将请求为 /application1/ 开头的请求路由至 application1 服务,保留请求url中的 /application1/ 。


QQ截图20200103100116.png

(4) api-gateway启动
注意在启动类上使用@EnableZuulProxy注解标识此工程为Zuul网关,启动类代码如下:

@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class ApiGatewayBootstrap {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayBootstrap.class, args);
}
}

当 Service1Bootstrap 启动后,应用 api-gateway 将出现在 Nacos 服务列表中。

QQ截图20200103100239.png

测试:
通过网关(api-gateway)请求Application1应用,Application1的业务实现又贯穿service1、service2,访问http://127.0.0.1:56010/application1/service ,将得到如下结果:
QQ截图20200103100345.png

附: Spring Cloud Nacos discovery Starter配置项信息说明

QQ截图20200103101218.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容