第三篇
This commit is contained in:
parent
d9d7bae339
commit
1b84b75db5
65
springcloud/第三篇所用代码/confsvr/pom.xml
Normal file
65
springcloud/第三篇所用代码/confsvr/pom.xml
Normal file
@ -0,0 +1,65 @@
|
||||
<?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>
|
||||
|
||||
<groupId>com.fxb</groupId>
|
||||
<artifactId>demo</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>confsvr</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>1.4.4.RELEASE</version>
|
||||
</parent>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-dependencies</artifactId>
|
||||
<version>Camden.SR5</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>1.8</java.version>
|
||||
<spring-cloud.version>Camden.SR5</spring-cloud.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-config-server</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-config</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
||||
</project>
|
@ -0,0 +1,14 @@
|
||||
package com.fxb.demo;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.config.server.EnableConfigServer;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableConfigServer
|
||||
public class ConfsvrApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(ConfsvrApplication.class, args);
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
server:
|
||||
port: 8888
|
||||
|
||||
spring:
|
||||
profiles:
|
||||
# 使用文件系统来存储配置信息,需要设置为native,git设置为git
|
||||
active: git
|
||||
application:
|
||||
name: test
|
||||
cloud:
|
||||
config:
|
||||
server:
|
||||
native:
|
||||
# 使用文件来存放配置文件,为每个应用程序提供用逗号分隔的文件夹列表
|
||||
searchLocations: file:///D:/configFolder/licensingservice
|
||||
git:
|
||||
uri: https://github.com/FleyX/demo-project
|
||||
# 查找配置文件路径(,分隔)
|
||||
search-paths: springcloud/config/licensingservice
|
||||
#如果为公开仓库,用户名密码可不填写
|
||||
username:
|
||||
password:
|
||||
#配置git仓库的分支
|
||||
label: master
|
||||
|
@ -0,0 +1,16 @@
|
||||
package com.fxb.demo;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest
|
||||
public class ConfsvrApplicationTests {
|
||||
|
||||
@Test
|
||||
public void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
72
springcloud/第三篇所用代码/eurekasvr/pom.xml
Normal file
72
springcloud/第三篇所用代码/eurekasvr/pom.xml
Normal file
@ -0,0 +1,72 @@
|
||||
<?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>
|
||||
|
||||
<groupId>com.fxb</groupId>
|
||||
<artifactId>eurekasvr</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>eurekasvr</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>1.4.4.RELEASE</version>
|
||||
</parent>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-dependencies</artifactId>
|
||||
<version>Camden.SR5</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>1.8</java.version>
|
||||
<spring-cloud.version>Camden.SR5</spring-cloud.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-eureka-server</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>spring-milestones</id>
|
||||
<name>Spring Milestones</name>
|
||||
<url>https://repo.spring.io/milestone</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
|
||||
</project>
|
@ -0,0 +1,14 @@
|
||||
package com.fxb.eurekasvr;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableEurekaServer
|
||||
public class EurekasvrApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(EurekasvrApplication.class, args);
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
server:
|
||||
port: 8761
|
||||
|
||||
eureka:
|
||||
client:
|
||||
#不注册自己
|
||||
register-with-eureka: false
|
||||
#不在本地缓存注册表信息
|
||||
fetch-registry: false
|
||||
server:
|
||||
#接受请求前的等待实际,开发模式下不要开启
|
||||
#wait-time-in-ms-when-sync-empty: 5
|
@ -0,0 +1,16 @@
|
||||
package com.fxb.eurekasvr;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest
|
||||
public class EurekasvrApplicationTests {
|
||||
|
||||
@Test
|
||||
public void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
81
springcloud/第三篇所用代码/licensingservice/pom.xml
Normal file
81
springcloud/第三篇所用代码/licensingservice/pom.xml
Normal file
@ -0,0 +1,81 @@
|
||||
<?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>
|
||||
|
||||
<groupId>com.fxb</groupId>
|
||||
<artifactId>licensingservice</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>licensingservice</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>1.4.4.RELEASE</version>
|
||||
</parent>
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-dependencies</artifactId>
|
||||
<version>Camden.SR5</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>1.8</java.version>
|
||||
<spring-cloud.version>Camden.SR5</spring-cloud.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-eureka</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-config-client</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-feign</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-hystrix</artifactId>
|
||||
</dependency>
|
||||
<!--本依赖不是必须的,spring-cloud-starter-hystrix已经带了,但是在Camden.SR5发行版本中使用了1.5.6,这个版本有一个不一致的地方,在
|
||||
没有后备的情况下会抛出java.lang.reflect.UndeclaredThrowableException而不是com.netflix.hystrix.exception.HystrixRuntimeException,
|
||||
在后续版本中修复了这个问题-->
|
||||
<dependency>
|
||||
<groupId>com.netflix.hystrix</groupId>
|
||||
<artifactId>hystrix-javanica</artifactId>
|
||||
<version>1.5.9</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
||||
</project>
|
@ -0,0 +1,31 @@
|
||||
package com.fxb.licensingservice.Entity;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 类功能简述:
|
||||
* 类功能详述:
|
||||
*
|
||||
* @author fanxb
|
||||
* @date 2018/11/22 19:52
|
||||
*/
|
||||
public class Licensing implements Serializable {
|
||||
private Organization organization;
|
||||
private boolean isValid;
|
||||
|
||||
public Organization getOrganization() {
|
||||
return organization;
|
||||
}
|
||||
|
||||
public void setOrganization(Organization organization) {
|
||||
this.organization = organization;
|
||||
}
|
||||
|
||||
public boolean isValid() {
|
||||
return isValid;
|
||||
}
|
||||
|
||||
public void setValid(boolean valid) {
|
||||
isValid = valid;
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.fxb.licensingservice.Entity;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 类功能简述:
|
||||
* 类功能详述:
|
||||
*
|
||||
* @author fanxb
|
||||
* @date 2018/11/22 19:30
|
||||
*/
|
||||
public class Organization implements Serializable {
|
||||
|
||||
private String id;
|
||||
private String name;
|
||||
|
||||
public Organization() {
|
||||
}
|
||||
|
||||
public Organization(String id, String name) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package com.fxb.licensingservice;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
|
||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
|
||||
import org.springframework.cloud.netflix.feign.EnableFeignClients;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableDiscoveryClient //使用不带Ribbon功能的Spring RestTemplate,其他情况下可删除
|
||||
@EnableFeignClients //使用Feign客户端进行服务调用,其他情况下可删除
|
||||
@EnableCircuitBreaker //告诉Spring Cloud将要使用Hystrix
|
||||
public class LicensingserviceApplication {
|
||||
|
||||
/**
|
||||
* 使用带有Ribbon 功能的Spring RestTemplate,其他情况可删除
|
||||
*/
|
||||
@LoadBalanced
|
||||
@Bean
|
||||
public RestTemplate getRestTemplate(){
|
||||
return new RestTemplate();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(LicensingserviceApplication.class, args);
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.fxb.licensingservice.client;
|
||||
|
||||
import com.fxb.licensingservice.Entity.Organization;
|
||||
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
|
||||
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
|
||||
import org.springframework.cloud.netflix.feign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
|
||||
/**
|
||||
* 类功能简述:
|
||||
* 类功能详述:
|
||||
*
|
||||
* @author fanxb
|
||||
* @date 2018/11/23 17:24
|
||||
*/
|
||||
@FeignClient(name="organizationservice",fallback = OrganizationFeignClientImpl.class)//使用FeignClient注解指定目标服务
|
||||
public interface OrganizationFeignClient {
|
||||
|
||||
/**
|
||||
* 获取组织信息
|
||||
*
|
||||
* @param orgId 组织id
|
||||
* @return Organization
|
||||
*/
|
||||
@HystrixCommand(commandProperties = {
|
||||
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
|
||||
})
|
||||
@RequestMapping(method = RequestMethod.GET, value = "/organization/{orgId}", consumes = "application/json")
|
||||
Organization getOrganization(@PathVariable("orgId") String orgId);
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
package com.fxb.licensingservice.client;
|
||||
|
||||
import com.fxb.licensingservice.Entity.Organization;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 类功能简述:
|
||||
* 类功能详述:
|
||||
*
|
||||
* @author fanxb
|
||||
* @date 2018/12/7 11:30
|
||||
*/
|
||||
@Component
|
||||
public class OrganizationFeignClientImpl implements OrganizationFeignClient{
|
||||
|
||||
@Override
|
||||
public Organization getOrganization(String orgId) {
|
||||
Organization organization=new Organization();
|
||||
organization.setId("0");
|
||||
organization.setName("后备模式返回的数据");
|
||||
return organization;
|
||||
}
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package com.fxb.licensingservice.controller;
|
||||
|
||||
import com.fxb.licensingservice.Entity.Licensing;
|
||||
import com.fxb.licensingservice.client.OrganizationFeignClient;
|
||||
import com.fxb.licensingservice.service.OrganizationByRibbonService;
|
||||
import com.fxb.licensingservice.service.OrganizationService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* 类功能简述:
|
||||
* 类功能详述:
|
||||
*
|
||||
* @author fanxb
|
||||
* @date 2018/11/22 19:51
|
||||
*/
|
||||
@RestController
|
||||
public class LicensingController {
|
||||
|
||||
private OrganizationService organizationService;
|
||||
private OrganizationByRibbonService ribbonService;
|
||||
private OrganizationFeignClient organizationFeignClient;
|
||||
|
||||
@Autowired
|
||||
public LicensingController(OrganizationService organizationService, OrganizationByRibbonService ribbonService, OrganizationFeignClient feignClient) {
|
||||
this.organizationService = organizationService;
|
||||
this.ribbonService = ribbonService;
|
||||
this.organizationFeignClient = feignClient;
|
||||
}
|
||||
|
||||
@GetMapping("/licensing/{orgId}")
|
||||
public Licensing getLicensing(@PathVariable("orgId") String orgId) {
|
||||
Licensing licensing = new Licensing();
|
||||
licensing.setValid(false);
|
||||
licensing.setOrganization(organizationService.getOrganization(orgId));
|
||||
return licensing;
|
||||
}
|
||||
|
||||
@GetMapping("/licensingByRibbon/{orgId}")
|
||||
public Licensing getLicensingByRibbon(@PathVariable("orgId") String orgId) throws Exception{
|
||||
Licensing licensing = new Licensing();
|
||||
licensing.setValid(false);
|
||||
licensing.setOrganization(ribbonService.getOrganizationWithRibbon(orgId));
|
||||
return licensing;
|
||||
}
|
||||
|
||||
@GetMapping("/licensingByFeign/{orgId}")
|
||||
public Licensing getLicensingByFeign(@PathVariable("orgId") String orgId) {
|
||||
Licensing licensing = new Licensing();
|
||||
licensing.setValid(false);
|
||||
licensing.setOrganization(organizationFeignClient.getOrganization(orgId));
|
||||
return licensing;
|
||||
}
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
package com.fxb.licensingservice.service;
|
||||
|
||||
import com.fxb.licensingservice.Entity.Organization;
|
||||
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
|
||||
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
/**
|
||||
* 类功能简述:
|
||||
* 类功能详述:
|
||||
*
|
||||
* @author fanxb
|
||||
* @date 2018/11/23 15:36
|
||||
*/
|
||||
@Component
|
||||
public class OrganizationByRibbonService {
|
||||
|
||||
private RestTemplate restTemplate;
|
||||
|
||||
|
||||
@Autowired
|
||||
public OrganizationByRibbonService(RestTemplate restTemplate) {
|
||||
this.restTemplate = restTemplate;
|
||||
}
|
||||
|
||||
@HystrixCommand(commandProperties = {
|
||||
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000")
|
||||
}, fallbackMethod = "getOrganizationWithRibbonBackup",
|
||||
threadPoolKey = "licenseByOrgThreadPool",
|
||||
threadPoolProperties = {
|
||||
@HystrixProperty(name = "coreSize", value = "30"),
|
||||
@HystrixProperty(name = "maxQueueSize", value = "10")
|
||||
})
|
||||
public Organization getOrganizationWithRibbon(String id) throws Exception {
|
||||
ResponseEntity<Organization> responseEntity = restTemplate.exchange("http://organizationservice/organization/{id}",
|
||||
HttpMethod.GET, null, Organization.class, id);
|
||||
return responseEntity.getBody();
|
||||
}
|
||||
|
||||
public Organization getOrganizationWithRibbonBackup(String id) throws Exception {
|
||||
Organization organization = new Organization();
|
||||
organization.setId("0");
|
||||
organization.setName("组织服务调用失败");
|
||||
return organization;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user