Nacos
Nacos = Eureka + Config + Bus (服务注册中心+配置中心+配置总线)
总工程 pom
<?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>org.example</groupId>
<artifactId>AlibabaCloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>nacos8848</module>
<module>order81</module>
<module>pay8002</module>
<module>pay8003</module>
<module>OrderBean</module>
</modules>
<packaging>pom</packaging>
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties>
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
消费者:
配置:
pom.xml
<dependencies>
<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.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.example</groupId>
<artifactId>OrderBean</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
yml
server:
port: 81
spring:
application:
name: order81
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置nacos地址
#暴露
management:
endpoints:
web:
exposure:
include: "*"
Main
/**
* @author qyc
* @time 2020/5/14 - 10:56
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@RibbonClients(value = {
@RibbonClient(value = "pay-service",configuration = MySelfRole.class)
})
public class Main81 {
public static void main(String[] args) {
SpringApplication.run(Main81.class,args);
}
}
自定义负载均衡: 注意在Mian类路径之上
@Configuration
public class MySelfRole {
@Bean
public IRule myRole(){
return new RoundRobinRule(); //随机
}
}
service
@Component
@FeignClient(value = "pay-service")
public interface ConsumerService {
@GetMapping("/select/{id}")
public Optional<Order> selectById(@PathVariable("id") Integer uid);
}
controller
@RestController
public class ConsumerController {
@Autowired
private ConsumerService consumerService;
@GetMapping("select/{id}")
public Optional<Order> select(@PathVariable("id") Integer id){
return consumerService.selectById(id);
}
}
开启日志:
@Configuration
public class Logging {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL; //开启日志
}
}
生产者
pom
<dependencies>
<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.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
yml
server:
port: 8002
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/qycs
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
jpa:
show-sql: true
application:
name: pay-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
mybatis:
mapper-locations: classpath:mybatiscfg/mapper/*.xml
config-location: classpath:mybatiscfg/mybatis.xml
management:
endpoints:
web:
exposure:
include: "*"
mybatis.xml
这是模板,为了简单我用的JPA
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 下划线转驼峰-->
<!-- <settings>-->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/>-->
<!-- </settings>-->
<!-- 分页-->
<!-- <plugins>-->
<!-- <plugin interceptor="com.github.pagehelper.PageInterceptor">-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- 整合细节
1. 要在启动类上添加 @MapperScan("com.springbootdemo02.mvc.mapper") 开启扫描
2. sql语句表名不能加“ ”
3. 版本要求不能太高
4. @Mapper
@Repository 消除警告
-->
</configuration>
mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qyc.mapper.OrderMapper">
</mapper>
Main
@SpringBootApplication
@EnableDiscoveryClient
public class Main8002 {
public static void main(String[] args){
SpringApplication.run(Main8002.class,args);
}
}
Order
@Entity
@Table(name = "qqqqq")
public class Order implements Serializable {
@Id
private int id;
private String number;
repository
public interface OrderRepository extends JpaRepository<Order, Integer> {
}
service
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
public Optional<Order> selectById(int id){
return orderRepository.findById(id);
}
}
controller
@RestController
public class OredrController {
@Value("${server.port}")
private String port;
@Autowired
private OrderService orderService;
@GetMapping("/select/{id}")
public Optional<Order> selectById(@PathVariable("id") Integer uid){
Optional<Order> order = orderService.selectById(uid);
order.get().setNumber(port);
return order;
}
}
全局配置config
8002端口
- 涉及到分组,命名空间
- bootstrap为系统配置文件,写什么看需求
- 我把nacos.discover放到了application
- 8003和8002基本一样
bootstrap.yaml : 注意后缀为yaml
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
group: testGroup
namespace: c2567bef-205d-47ed-8f76-23d000ee0c69
application.yml
server:
port: 8002
spring:
profiles:
active: test
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/qycs
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
jpa:
show-sql: true
application:
name: pay-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
mybatis:
mapper-locations: classpath:mybatiscfg/mapper/*.xml
config-location: classpath:mybatiscfg/mybatis.xml
management:
endpoints:
web:
exposure:
include: "*"
8003
bootstrap
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
group: devGroup
namespace: c2567bef-205d-47ed-8f76-23d000ee0c69
application
server:
port: 8003
spring:
profiles:
active: dev
application:
name: pay-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
group: devGroup
namespace: c2567bef-205d-47ed-8f76-23d000ee0c69
management:
endpoints:
web:
exposure:
include: "*"
Main不变
nacos上的配置随便写的:
config:
info: pay-service-dev.yaml devGroup version=1
controller增加一个刷新标签
@RestController
@RefreshScope
public class OredrController {
@Value("${server.port}")
private String port;
持久化
线创建号一个数据库 :nacos_config
然后执行sql语句nacos-mysql(复制)
在application增加配置
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?
characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
然后重启就可以了(新建一个配置,发现数据库里面已经保存了)