micronaut+consul构建微服务应用

Micronaut 是一个新一代基于 JVM 的全栈的微服务框架,用于构建模块化的、易于测试的微服务应用。本文通过简单的两个例子来简单介绍一下用micronaut构建微服务应用。

一、跑一个consul注册中心

下载consul

由于官网下载太慢了,所以可以找找其他资源,比如这个:https://download.csdn.net/download/m0_46455711/13184176

启动

解压下载文件,里面只有一个consul.exe文件,直接命令行运行就好了:

.\consul.exe agent -dev -ui

打开浏览器,访问:http://localhost:8500/,发现能访问就说明注册中心consul已经准备好了:
在这里插入图片描述

二、安装micronaut

  1. 首先还是下载micronaut framework,可以官网下载,但是比较慢,可以在这里下载:https://download.csdn.net/download/m0_46455711/13184282
  2. 解压下载下来的文件,将其bin目录添加到环境变量Path中

三、构建以consul为注册中心的微服务应用

项目构建命令

在放项目的目录下执行如下命令来构建一个为服务项目:

mn create-app my-app1 --lang groovy --features hibernate-gorm,config-consul,discovery-consul

这里 my-app1是项目名称,指定groovy为主要的开发语言,同时启用hibernate-gorm作为数据框架,config-consul作为配置中心,discovery-consul服务注册发现

构建的项目

命令执行完成后会在当前目录下生成目录结构如下的项目:
生成的项目
打开build.gradle我们可以看到相关的依赖已经添加好了,当然在这里我们也可以添加其他的依赖:
在这里插入图片描述
打开文件bootstrap.yml,我们可以看到已经配置好服务注册中心的地址为本地和8500,也就是前面我们运行的consul,当然在这里我们也可以设置当前服务的端口:
在这里插入图片描述
application.yml里面默认配置了一个h2数据库和hibernate:
在这里插入图片描述
默认情况下,这里是gradle-6.7-bin.zip,但是发现下载很久都下载不下来,所以可以手动改成本地已经下载好的zip,比如这里,我改成了gradle-6.7-all.zip
在这里插入图片描述

四、写代码

1. 创建一个域类(简单理解就是数据库操作类),命名为SomeTest:

package my.app1.domain

import grails.gorm.annotation.Entity

@Entity
class SomeTest {
    
    
    long id
    String name
}

需要注意的是注解@Entity是必须的,它表示了这个类是一个域类

2.创建一个service

package my.app1.service

import grails.gorm.transactions.Transactional
import my.app1.domain.SomeTest
import org.slf4j.Logger
import org.slf4j.LoggerFactory

import javax.inject.Singleton

@Singleton
@Transactional
class HelloService {
    
    
    private static Logger log = LoggerFactory.getLogger(HelloService.class)

    void addSomeTest(){
    
    
        SomeTest someTest=new SomeTest()
        someTest.id=0
        someTest.name="hello"
        if(!someTest.save(flush:true)){
    
    
            log.error("保存数据到数据库出错:",someTest.getErrors())
        }
    }

    List<SomeTest> findAllSomeTest(){
    
    
       return SomeTest.findAll()
    }
}

这里注解@Singleton 标示出单体,注解@Transactional标识在这里可以使用域类

3、创建一个controller

package my.app1.controller

import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import my.app1.domain.SomeTest
import my.app1.service.HelloService

import javax.inject.Inject

@Controller("/hello")
class HelloController {
    
    

    @Inject
    HelloService helloService

    @Get(uri="/add", produces="text/plain")
    String add() {
    
    
        helloService.addSomeTest()
        return "ok"
    }

    @Get(uri="/all", produces= MediaType.APPLICATION_JSON)
    List<SomeTest> all() {
    
    
        return helloService.findAllSomeTest()
    }

}

这个没啥说的,唯一要说的是,这里用注解@Inject把我们前面创建的service注入进来

到现在我们已经创建好一个具有数据库操作能力的微服务,运行Application中的main方法来启动这个微服务,启动成功后,用浏览器访问相应接口发现没有问题,并且在consul中也注册上了该服务。

扫描二维码关注公众号,回复: 12272428 查看本文章

五、再写一个微服务,通过注册中心进行访问

微服务框架一个关键的需求就是服务的注册发现以及服务之间的调用。通过前面的说明,我们知道micronaut已经集成好了consul客户端,通过简单的配置就能实现服务启动后自动注册到服务注册中心。当然对于服务的发现以及服务调用,micronaut也做了很好的支持。

1、新建一个微服务

mn create-app my-app2 --lang groovy --features hibernate-gorm,config-consul,discovery-consul

2、设置服务端口

micronaut:
  server:
    port: 8082

3、新建一个controller

package my.app2

import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import org.slf4j.Logger
import org.slf4j.LoggerFactory

@Controller("/hello")
class HelloController {
    
    

    private static Logger log = LoggerFactory.getLogger(HelloController.class)
    
    @Get(uri="/", produces="text/plain")
    String index() {
    
    
        log.info("im hello two")
        "im hello two"
    }
}

4、在微服务my-app1添加服务调用客户端

package my.app1.client

import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Get
import io.micronaut.http.client.annotation.Client
import io.micronaut.retry.annotation.Retryable

@Client("myApp2")
@Retryable
interface HelloClient {
    
    
    @Get(value = "/hello", processes = MediaType.TEXT_PLAIN)
    String hello()
}

注解@Client标识出这个接口是服务调用接口,myApp2是服务名(用命令构建my-app2后,创建出来的服务名就是myApp2,可以在配置文件bootstrap.yml中查看和修改),另外值得注意的是这里服务名也可以换成被调用服务具体的http地址和端口。

5、微服务my-app1添加一个fallback,在服务不可用的时候使被调用接口返回一个默认值

package my.app1.client;

import io.micronaut.retry.annotation.Fallback;
import io.micronaut.retry.annotation.Recoverable;

@Fallback
@Recoverable
public class HelloFallback implements HelloClient {
    
    

    @Override
    public String hello() {
    
    
        return "i am hello fallback";
    }
}

这里需要注意的是,这里必须是一个java文件而不是groovy文件,具体为啥我也不知道,很郁闷。

6、微服务my-app1中使用服务调用客户端

在这里插入图片描述

用@Inject注入客户端,像调用普通方法一样调用服务接口

7、启动新建的服务my-app2以及重启服务my-app1

浏览器访问:http://localhost:8081/hello/add,可以看到返回:ok im hello two

总结

也没啥总结的,把例子的下载地址粘出来吧
https://gitee.com/luoye_lj/micronaut_example

micronaut_cloud_examples.zip

猜你喜欢

转载自blog.csdn.net/m0_46455711/article/details/110085955