Commit 82be6264 authored by lihaipeng's avatar lihaipeng

first commit

parent 587c66ba
Pipeline #123 failed with stages
# Logs
logs
*.log
npm-debug.log*
**/logs
**/*.log
**/npm-debug.log*
# Runtime data
pids
*.pid
*.seed
**/pids
**/*.pid
**/*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
**/lib-cov
# Coverage directory used by tools like istanbul
coverage
**/coverage
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
**/.grunt
# node-waf configuration
.lock-wscript
**/.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
**/build/Release
# Dependency directory
node_modules
**/node_modules
# Bower Dependency directory
bower_components
**/bower_components
# Optional npm cache directory
.npm
**/.npm
# Optional REPL history
.node_repl_history
**/.node_repl_history
# Yarn lock
yarn.lock
*/yarn.lock
# npm lock
*-lock.json
**/*-lock.json
# package directory
dist
**/dist
# webpack compile dist directory
srv/public
**/srv/public
# vscode config
.vscode
**/.vscode
# project file
.project
**/.project
# maven compile target directory
target
**/target
# maven config directory
.mvn
**/.mvn
# eclipse settings directory
.settings
**/.settings
# eclipse classpath file
.classpath
**/.classpath
# eclipse factorypath file
.factorypath
**/.factorypath
# tern-project file
.tern-project
**/.tern-project
# mymetadata file
.mymetadata
**/.mymetadata
# apt_generated directory
.apt_generated
**/.apt_generated
# idea config file
*.iml
**/*.iml
.idea
**/.idea
.DS_Store
**/.DS_Store
# unififi-spring-cloud-guide
# unififi-spring-cloud-guide
> 此项目可以已最简单的方式启动并运行,引导大家快速了解并学习”UNIFIFI微服务架构“相关的技术栈与实践方法。
>
> 基于Spring Cloud Version: Hoxton.SR4、Spring Cloud Alibaba Version: 2.2.1.RELEASE构建的微服务框架。整合了nacos、sentinel、gateway、openfeign、ribbon等组件。
>
> 持续更新
## 依赖环境
* JDK 1.8+
* Spring Cloud Version: Hoxton.SR4
* Spring Boot Alibaba Version: 2.2.1.RELEASE
* Spring Boot Version: 2.2.7.RELEASE
## 依赖中间件
* Mysql 5.6
* Nacos 1.2.1
* Sentinel 1.7.2
* RocketMQ 4.5.1
## 功能
* 服务注册与发现(Nacos Discovery)
* 统一配置管理(Nacos Config)
* 高可用防护(Sentinel)- 生成环境使用待研究
* 动态路由及失败重试(OpenFeign、Ribbon)
* 网关权限校验(Spring Cloud Gateway)
## 待办列表
* 支持mybatis-plus - 未完成
* 支持Redis - 未完成
* 支持RocketMQ - 未完成
* 统一记录进出日志 - 未完成
* Dockerfile - 未完成
* 统一接口管理(Swagger-Yapi) - 未完成
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.7.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.unififi</groupId>
<artifactId>unififi-spring-cloud-guide</artifactId>
<version>0.0.1</version>
<name>unififi-spring-cloud-guide</name>
<packaging>pom</packaging>
<modules>
<module>unififi-demo-api</module>
<module>unififi-demo1-service</module>
<module>unififi-demo2-service</module>
<module>unififi-gateway</module>
</modules>
<properties>
<unififi-service.version>0.0.1</unififi-service.version>
<unififi-api.version>0.0.1</unififi-api.version>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>unififi-spring-cloud-guide</artifactId>
<groupId>com.unififi</groupId>
<version>0.0.1</version>
</parent>
<artifactId>unififi-demo-api</artifactId>
<version>${unififi-api.version}</version>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<exclusions>
<exclusion>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-hystrix</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
package com.unififi.demo.model;
import lombok.Data;
@Data
public class User {
private String name;
private Integer age;
}
package com.unififi.demo.service;
import com.unififi.demo.model.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@FeignClient(value = "unififi-demo2-service")
public interface UserService {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
String echo(@PathVariable String string);
@GetMapping("/user/list")
List<User> list();
@GetMapping("/user/get")
User get(@RequestParam("name") String name);
@PostMapping("/user/add")
Boolean add(@RequestBody User user);
}
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>unififi-spring-cloud-guide</artifactId>
<groupId>com.unififi</groupId>
<version>0.0.1</version>
</parent>
<artifactId>unififi-demo1-service</artifactId>
<version>${unififi-service.version}</version>
<dependencies>
<dependency>
<groupId>com.unififi</groupId>
<artifactId>unififi-demo-api</artifactId>
<version>${unififi-api.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.retry</groupId>-->
<!-- <artifactId>spring-retry</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
package com.unififi.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Demo1Application {
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public RestTemplate restTemplate1() {
return new RestTemplate();
}
}
package com.unififi.demo.config;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Component
@Configuration
@RefreshScope
@Getter
public class AppConfig {
@Value("${user.name}")
public String username;
}
package com.unififi.demo.controller;
import com.unififi.demo.config.AppConfig;
import com.unififi.demo.model.User;
import com.unififi.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.Random;
@RestController
public class Demo1Controller {
@Autowired
private RestTemplate restTemplate;
@Autowired
private UserService userService;
@Autowired
private AppConfig appConfig;
@GetMapping("/echo/{string}")
public String echo(@PathVariable String string) {
return "unififi-demo1-service echo: " + string;
}
@PostMapping(value = "/user/add", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
public Boolean userAdd(@RequestBody User user) {
return userService.add(user);
}
@GetMapping("/user/get")
public User userGet(@RequestParam("name") String name) {
return userService.get(name);
}
@GetMapping(value = "/user/list")
public List<User> userList() {
return restTemplate.getForObject("http://unififi-demo2-service/user/list", List.class);
}
@GetMapping("/config/username")
public String configUsername() {
return appConfig.getUsername();
}
@GetMapping("/sleep")
public String sleep() {
try {
long ms = (new Random().nextInt(10) + 1) * 1000;
Thread.sleep(ms);
System.out.println("sleep " + ms);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "ok";
}
}
server:
port: 18081
management:
endpoints:
web:
exposure:
include: '*'
spring:
application:
name: unififi-demo1-service
cloud:
# loadbalancer:
# retry:
# enabled: true # 开启Spring Cloud的重试功能
sentinel:
transport:
dashboard: 39.106.6.97:8849
# datasource:
# flow:
# nacos:
# server-addr: localhost:8848
# dataId: ${spring.application.name}-flow-rules
# groupId: SENTINEL_GROUP
# # 规则类型,取值见:
# # org.springframework.cloud.alibaba.sentinel.datasource.RuleType
# rule-type: flow
# degrade:
# nacos:
# server-addr: localhost:8848
# dataId: ${spring.application.name}-degrade-rules
# groupId: SENTINEL_GROUP
# rule-type: degrade
# system:
# nacos:
# server-addr: localhost:8848
# dataId: ${spring.application.name}-system-rules
# groupId: SENTINEL_GROUP
# rule-type: system
# authority:
# nacos:
# server-addr: localhost:8848
# dataId: ${spring.application.name}-authority-rules
# groupId: SENTINEL_GROUP
# rule-type: authority
# param-flow:
# nacos:
# server-addr: localhost:8848
# dataId: ${spring.application.name}-param-flow-rules
# groupId: SENTINEL_GROUP
# rule-type: param-flow
feign:
sentinel:
enabled: true
compression:
request:
enabled: true
mime-types: application/json
min-request-size: 2048
response:
enabled: true
useGzipDecoder: true
client:
config:
default:
connectTimeout: 2000
readTimeout: 3000
loggerLevel: full
logging:
level:
com.unififi.demo.service.UserService: DEBUG
#ribbon:
# OkToRetryOnAllOperations: true
# MaxAutoRetries: 1 #重试次数
# MaxAutoRetriesNextServer: 0 #重试切换实例次数
# ConnectTimeout: 2000
# ReadTimeout: 3000
# retryableStatusCodes: 503,500 # 这里不配置其实也可以,不配置的时候,仅仅当请求服务实例报错的时候重试,配置了的时候,当请求服务实例出现这里指定的状态,也会重试
\ No newline at end of file
spring:
cloud:
nacos:
username: nacos
password: nacos
server-addr: 39.106.6.97:8848
config:
shared-configs:
- data-id: unififi-common.properties
refresh: false
group: DEFAULT_GROUP
extension-configs:
- refresh: true
data-id: unififi-ext.properties
group: DEFAULT_GROUP
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>unififi-spring-cloud-guide</artifactId>
<groupId>com.unififi</groupId>
<version>0.0.1</version>
</parent>
<artifactId>unififi-demo2-service</artifactId>
<version>${unififi-service.version}</version>
<dependencies>
<dependency>
<groupId>com.unififi</groupId>
<artifactId>unififi-demo-api</artifactId>
<version>${unififi-api.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
package com.unififi.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class Demo2Application {
public static void main(String[] args) {
SpringApplication.run(Demo2Application.class, args);
}
}
package com.unififi.demo.controller;
import com.unififi.demo.model.User;
import com.unififi.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class Demo2Controller {
@Autowired
private UserService userService;
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return userService.echo(string);
}
@PostMapping(value = "/user/add", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
public Boolean add(@RequestBody User user) {
return userService.add(user);
}
@GetMapping("/user/list")
public List<User> list() throws InterruptedException {
Thread.sleep(5000L);
return userService.list();
}
@GetMapping("/user/get")
public User get(@RequestParam("name") String name) throws InterruptedException {
Thread.sleep(5000L);
System.out.println("user/get "+ name);
return userService.get(name);
}
}
package com.unififi.demo.service;
import com.unififi.demo.model.User;
import lombok.extern.java.Log;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Log
@Service
public class UserServiceImpl implements UserService {
private static final List<User> USERS = new ArrayList<>();
@Override
public String echo(String string) {
return "unififi-demo2-service echo: " + string;
}
@Override
public List<User> list() {
log.info("user list. size:" + USERS.size());
return USERS;
}
@Override
public User get(String name) {
return USERS.stream().filter(u -> name.equals(u.getName())).collect(Collectors.toList()).get(0);
}
@Override
public Boolean add(User user) {
log.info("user add. tostring:" + user.toString());
USERS.add(user);
return true;
}
}
server:
port: 18080
management:
endpoints:
web:
exposure:
include: '*'
spring:
application:
name: unififi-demo2-service
\ No newline at end of file
spring:
cloud:
nacos:
username: nacos
password: nacos
server-addr: 39.106.6.97:8848
config:
shared-configs:
- data-id: unififi-common.properties
refresh: false
group: DEFAULT_GROUP
extension-configs:
- refresh: true
data-id: unififi-ext.properties
group: DEFAULT_GROUP
<?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>unififi-spring-cloud-guide</artifactId>
<groupId>com.unififi</groupId>
<version>0.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>unififi-gateway</artifactId>
<version>0.0.1</version>
<dependencies>
<dependency>
<groupId>com.unififi</groupId>
<artifactId>unififi-demo-api</artifactId>
<version>${unififi-api.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</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-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.csp</groupId>-->
<!-- <artifactId>sentinel-datasource-nacos</artifactId>-->
<!-- </dependency>-->
</dependencies>
</project>
package com.unififi.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
server:
port: 18082
management:
endpoints:
web:
exposure:
include: '*'
spring:
application:
name: unififi-gateway
cloud:
sentinel:
filter:
enabled: true
transport:
dashboard: 39.106.6.97:8849
gateway:
enabled: true
discovery:
locator:
lower-case-service-id: true
routes:
- id: unififi-demo1-service-route
uri: lb://unififi-demo1-service/
predicates:
- Path=/demo1/**
filters:
- StripPrefix=1
- id: unififi-demo2-service-route
uri: lb://unififi-demo2-service/
predicates:
- Path=/demo2/**
filters:
- StripPrefix=1
\ No newline at end of file
spring:
cloud:
nacos:
username: nacos
password: nacos
server-addr: 39.106.6.97:8848
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment