AI prompts
base on trouve : A built-in integrated service discovery, service registration, and service forwarding general component for Spring projects <img src="doc/image/trouve_pic.png" width="70%" syt height="30%" />
## Trouve : Simple, convenient, and fast! A built-in integrated service discovery, service registration, and service forwarding general component for Spring projects, compared to the need for independently deployed services like Zookeeper, Nacos, etc., it is easier and more convenient to use and deploy.
[[中文版]](doc/README_zh.md)
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
--------
## Introduction
Latest version:
```xml
<dependency>
<groupId>com.lei6393.trouve</groupId>
<artifactId>trouve-client</artifactId>
<version>1.1.0</version>
</dependency>
```
```xml
<dependency>
<groupId>com.lei6393.trouve</groupId>
<artifactId>trouve-server</artifactId>
<version>1.1.0</version>
</dependency>
```
## Client-side usage
### 1. Introduce the dependency package
```xml
<dependency>
<groupId>com.lei6393.trouve</groupId>
<artifactId>trouve-client</artifactId>
<version>LATEST</version>
</dependency>
```
### 2. To add an annotation to the Spring Boot startup class
```java
@EnableTrouveRegistry(
value = "test_service_name", // servie name. Each accessing service needs to be given a separate name
serverAddresses = @ServerAddress(schema = "http", host = "127.0.0.1", port = 8279) // Obtain the server address of the trouve service, prioritize getting it from the configuration, and use annotation if the configuration is empty
)
@SpringBootApplication
public class ClientTestApp {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(ClientTestApp.class);
application.setDefaultProperties(Collections.<String, Object>singletonMap("server.port", "8278"));
application.run(args);
}
}
```
### 3. To expose a RestController or API, simply add @ExposeApi on it
- Adding it to the class will expose all APIs within the class
- Adding it to the API method will only expose that API
example :
```java
// expose all
@RestController
@RequestMapping("/expose/all")
@ExposeApi
public class ExposeAllMethodController {
@RequestMapping(value = "/{path}/one", produces = "application/json")
@ResponseBody
public String testMethod1() {
return "{\"message\":\"success call client service\"}";
}
@RequestMapping(value = "/{path}/two", produces = "application/json")
@ResponseBody
public String testMethod2() {
return "{\"message\":\"success call client service\"}";
}
}
// expose alone
@RestController
@RequestMapping("/expose/alone")
public class ExposeAloneMethodController {
@RequestMapping(value = "/{path}/true", produces = "application/json")
@ResponseBody
@ExposeApi
public String testMethodOne() {
return "{\"message\":\"success call client service\"}";
}
@RequestMapping(value = "/{path}/false", produces = "application/json")
@ResponseBody
public String testMethodTwo() {
return "{\"message\":\"success call client service\"}";
}
}
```
### 4. Supported configuration properties:
```properties
# trouve Supports automatic IP acquisition. If the automatically acquired IP is not usable, this property can be used to specify an IP
trouve.client.ip=168.0.0.1
# trouve Supports automatic port acquisition (dependent on Spring's default configuration server.port). If the automatically acquired port is not usable, this property can be used to specify a port
trouve.client.port=8888
# spring Defaults to exposing the port, will prioritize acquiring this port
server.port= 9999
# The preferred trouve service server address, supports passing multiple values, separated by ','
trouve.server.address=http://127.0.0.1:8888
```
## Server-side usage
### 1. Introduce the dependency package
```xml
<dependency>
<groupId>com.lei6393.trouve</groupId>
<artifactId>trouve-server</artifactId>
<version>LATEST</version>
</dependency>
```
### 2. Add annotation `@EnableTrouveDiscover("openapi")` to the startup class
example:
```java
@SpringBootApplication
@EnableTrouveDiscover("openapi")
public class ServerSingletonTestApp {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(ServerSingletonTestApp.class);
application.setDefaultProperties(Collections.<String, Object>singletonMap("server.port", "8279"));
application.run(args);
}
}
```
Mandatory item is namespace, each server service must be set with a unique value
### 3. Configure the entry point for service forwarding:`TrouveRequestDispatcher.entrance(request, response);`
example:
```java
@RestController
public class EntranceController {
@RequestMapping("**")
public void entrance(HttpServletRequest request,
HttpServletResponse response) throws Throwable {
TrouveRequestDispatcher.entrance(request, response);
}
}
```
### 4. Usage in cluster mode:
- The server side of trouve defaults to single-machine mode
- "To enable cluster mode (implemented through Redis), the following parameters need to be configured:
```properties
# Enable flag
trouve.server.redis.enable=true
# redis address
trouve.server.redis.singleServer=127.0.0.1:6379
# redis password, if none, can be left blank
trouve.server.redis.password=123456
```
", Assign "at most 3 tags" to the expected json: {"id":"8122","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"