├── README.md ├── Spring-Boot-Micro-Currency-Conversion-Service ├── .gitignore ├── .mvn │ └── wrapper │ │ ├── MavenWrapperDownloader.java │ │ ├── maven-wrapper.jar │ │ └── maven-wrapper.properties ├── Dockerfile ├── currency-conversion-service.yaml ├── mvnw ├── mvnw.cmd ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── currencyconversion │ │ │ ├── SpringBootMicroCurrencyConversionServiceApplication.java │ │ │ ├── controller │ │ │ └── CurrencyConversionController.java │ │ │ ├── model │ │ │ └── CurrencyConversionBean.java │ │ │ └── proxy │ │ │ └── CurrencyExchangeServiceProxy.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── com │ └── example │ └── currencyconversion │ └── SpringBootMicroCurrencyConversionService │ └── SpringBootMicroCurrencyConversionServiceApplicationTests.java ├── Spring-Boot-Micro-Forex-Service ├── .gitignore ├── .mvn │ └── wrapper │ │ ├── MavenWrapperDownloader.java │ │ ├── maven-wrapper.jar │ │ └── maven-wrapper.properties ├── Dockerfile ├── forex-service.yaml ├── mvnw ├── mvnw.cmd ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── forex │ │ │ ├── SpringBootMicroForexServiceApplication.java │ │ │ ├── controller │ │ │ └── ForexController.java │ │ │ ├── dao │ │ │ └── ExchangeValueRepository.java │ │ │ └── model │ │ │ └── ExchangeValue.java │ └── resources │ │ ├── application.properties │ │ └── data.sql │ └── test │ └── java │ └── com │ └── example │ └── forex │ └── SpringBootMicroForexService │ └── SpringBootMicroForexServiceApplicationTests.java └── screens ├── analyticsPlugin.png ├── apiGateway.png ├── authentication.png ├── clientToServiceCommunication.png ├── communityvsentreprise.png ├── docker-containers-1.png ├── gateway-stack-2.png ├── kong-conclusion.png ├── kong.png ├── konga-connection.png ├── securityPlugin.png ├── serverlessPlugin.png ├── test └── traficControlPlugin.png /README.md: -------------------------------------------------------------------------------- 1 | Please feel free to contact me if you need any further information https://www.linkedin.com/in/anas-tayaa-37b249163/ 2 | # Kong API Gateway and Spring Boot Microservices 3 | ## Context 4 | Working with a microservices API gateway can greatly reduce coding efforts, make applications far more efficient, and decrease 5 | errors all at that same time. An advantage of using microservices is that we don’t have to interact with a huge code base. 6 | Microservices are small and flexible. we can choose precisely which bits of code you want to interact with and from where 7 | those bits come. It’s possible to mix and match bits of code as needed. 8 | 9 | However, in a microservices architecture, each microservice exposes a set of (typically) fine-grained endpoints. This fact can impact the client-to-microservice communication. 10 | ### Direct client-to-microservice communication 11 | A possible approach is to use a direct client-to-microservice communication architecture. In this approach, a client app can make 12 | requests directly to some of the microservices. 13 | 14 | ![alt test](screens/clientToServiceCommunication.png) 15 | 16 | In this approach, each microservice has a public endpoint, sometimes with a different TCP port for each microservice. 17 | 18 | In a production environment based on a cluster, that URL would map to the load balancer used in the cluster, which in turn 19 | distributes the requests across the microservices. In production environments, we could have an Application Delivery Controller 20 | (ADC) between microservices and the Internet. This acts as a transparent tier that not only 21 | performs load balancing, but secures your services by offering SSL termination. This improves the load of hosts by 22 | offloading CPU-intensive SSL termination and other routing duties to the ADC. In any case, a load balancer and ADC are transparent 23 | from a logical application architecture point of view. 24 | 25 | A direct client-to-microservice communication architecture could be good enough for a small microservice-based application, 26 | especially if the client app is a server-side web application like an ASP.NET MVC app. However, when you build large and complex 27 | microservice-based applications (for example, when handling dozens of microservice types), and especially when the client apps 28 | are remote mobile apps or SPA web applications, that approach faces a few issues. 29 | 30 | Let’s imagine we are building an online store that uses the Microservice architecture pattern and that we are implementing 31 | the product details page. we need to develop multiple versions of the product details user interface: 32 | * HTML5/JavaScript-based UI for desktop and mobile browsers - HTML is generated by a server-side web application 33 | * Native Android and iPhone clients - these clients interact with the server via REST APIs 34 | 35 | In addition, the online store must expose product details via a REST API for use by 3rd party applications. 36 | 37 | A product details UI can display a lot of information about a product. For example, the Amazon.com details page for POJOs 38 | in Action displays: 39 | * Basic information about the book such as title, author, price, etc. 40 | * Your purchase history for the book 41 | * Availability 42 | * Buying options 43 | * Other items that are frequently bought with this book 44 | * Other items bought by customers who bought this book 45 | * Customer reviews 46 | * Sellers ranking 47 | * ... 48 | 49 | Since the online store uses the Microservice architecture pattern the product details data is spread over multiple services. 50 | For example: 51 | * Product Info Service - basic information about the product such as title, author 52 | * Pricing Service - product price 53 | * Order service - purchase history for product 54 | * Inventory service - product availability 55 | * Review service - customer reviews … 56 | 57 | Consequently, the code that displays the product details needs to fetch information from all of these services. 58 | #### Problem 59 | How do the clients of a Microservices-based application access the individual services? 60 | #### Forces 61 | 62 | 63 | * The granularity of APIs provided by microservices is often different than what a client needs. Microservices typically 64 | provide fine-grained APIs, which means that clients need to interact with multiple services. 65 | For example, as described above, a client needing the details for a product needs to fetch data from numerous services. 66 | 67 | * Different clients need different data. For example, the desktop browser version of a product details page desktop is 68 | typically more elaborate then the mobile version. 69 | 70 | * Network performance is different for different types of clients. For example, a mobile network is typically much slower 71 | and has much higher latency than a non-mobile network. And, of course, any WAN is much slower than a LAN. This means that 72 | a native mobile client uses a network that has very difference performance characteristics than a LAN used 73 | by a server-side web application. The server-side web application can make multiple requests to backend 74 | services without impacting the user experience where as a mobile client can only make a few. 75 | 76 | * The number of service instances and their locations (host+port) changes dynamically 77 | 78 | * Partitioning into services can change over time and should be hidden from clients 79 | 80 | * Services might use a diverse set of protocols, some of which might not be web friendly 81 | #### Solution 82 | Implement an API gateway that is the single entry point for all clients. The API gateway handles requests in one of two ways. 83 | Some requests are simply proxied/routed to the appropriate service. It handles other requests by fanning out to multiple 84 | services. 85 | ### API Gateways 86 | In a microservices architecture, the client apps usually need to consume functionality from more than one microservice. 87 | If that consumption is performed directly, the client needs to handle multiple calls to microservice endpoints. 88 | What happens when the application evolves and new microservices are introduced or existing microservices are updated? 89 | If the application has many microservices, handling so many endpoints from the client apps can be a nightmare. 90 | Since the client app would be coupled to those internal endpoints, evolving the microservices in the future can cause 91 | high impact for the client apps. 92 | 93 | When we design and build large or complex microservice-based applications with multiple client apps, a good approach to consider 94 | can be an API Gateway. This is a service that provides a single-entry point for certain groups of microservices. It's similar 95 | to the Facade pattern from object-oriented design, but in this case, it's part of a distributed system. The API Gateway pattern 96 | is also sometimes known as the "backend for frontend" (BFF) because we build it while thinking about the needs of the client app. 97 | 98 | Therefore, the API gateway sits between the client apps and the microservices. It acts as a reverse proxy, routing requests 99 | from clients to services. It can also provide additional cross-cutting features such as authentication, SSL termination, 100 | and cache. 101 | 102 | ![alt test](screens/apiGateway.png) 103 | 104 | This example shows the API Gateway pattern implementation. 105 | #### Resulting context 106 | Using an API gateway has the following benefits: 107 | 108 | * Insulates the clients from how the application is partitioned into microservices 109 | * Insulates the clients from the problem of determining the locations of service instances 110 | * Provides the optimal API for each client 111 | * Reduces the number of requests/roundtrips. For example, the API gateway enables clients to retrieve data from multiple 112 | services with a single round-trip. Fewer requests also means less overhead and improves the user experience. 113 | An API gateway is essential for mobile applications. 114 | * Simplifies the client by moving logic for calling multiple services from the client to API gateway 115 | * Translates from a “standard” public web-friendly API protocol to whatever protocols are used internally 116 | ## Kong API Gateway 117 | ### Definition 118 | Kong is Orchestration Microservice API Gateway. Kong provides a flexible abstraction layer that securely manages communication 119 | between clients and microservices via API. Also known as an API Gateway, API middleware or in some cases Service Mesh. 120 | It is available as open-source project in 2015, its core values are high performance and extensibility. 121 | 122 | Kong is a Lua application running in Nginx and made possible by the lua-nginx-module. 123 | 124 | Kong can help by acting as a gateway (or a sidecar) for microservices requests while providing load balancing, logging, 125 | authentication, rate-limiting, transformations, and more through plugins. 126 | 127 | ![alt test](screens/kong.png) 128 | 129 | Once the Kong gateway is running, it will expose two endpoints: 130 | * A proxy endpoint where consumers can send all their traffic to; 131 | * A management endpoint, also known as Kong Management API, to configure the gateway itself. 132 | 133 | Administrators can use the Admin REST API or CLI to configure the gateway which allows them to fully script repetitive tasks. 134 | However, there is no out-of-the-box support for infrastructure-as-code to manage your gateway. 135 | 136 | Every gateway is backed by a data store that contains all the relevant configuration which can be stored in Apache Cassandra 137 | or PostgreSQL. This is also where Kong shines as it is a cluster-based technology that allows to easily scale out by adding 138 | more nodes, but it still only requires one data store making it easier to manage. 139 | 140 | Here is a bird’s-eye overview of the gateway stack: 141 | 142 | ![alt test](screens/gateway-stack-2.png) 143 | ### Features and Plugins 144 | Kong provide a collection of plugins that accelerate development time: 145 | 146 | * Authentication plugin that we could choose from Basic authentication, JWT, LDAP, OAUTH2; 147 | * Security plugin that additional security layers such as ACL, CORS, Dynamic SSL, IP Restriction; 148 | * Traffic control plugin is a very useful for limited cost such as rate limiting, request size limiting, response rate limiting; 149 | * Serverless – Invoke serverless functions via APIs 150 | * Analytics and monitoring plugin that visualise, inspect and monitor API traffic such as Prometheus, data dog and Runscope; 151 | * Transformation plugin that transform request and responses on the fly such as Request Transformer, Response Transformer; 152 | * Logging plugin that log request and response data using the best transport for your infrastructure: TCP, UDP, HTTP, StatsD, 153 | Syslog; 154 | * ... 155 | ### Distributions 156 | * Kong Docker: A Dockerfile for running Kong in Docker. 157 | * Kong Packages: Pre-built packages for Debian, Red Hat, and OS X distributions (shipped with each release). 158 | * Kong Vagrant: A Vagrantfile for provisioning a development-ready environment for Kong. 159 | * Kong Homebrew: Homebrew Formula for Kong. 160 | * Kong CloudFormation: Kong in a 1-click deployment for AWS EC2. 161 | * Kong AWS AMI: Kong AMI on the AWS Marketplace. 162 | * Kong on Microsoft Azure: Run Kong using Azure Resource Manager. 163 | * Kong on Heroku: Deploy Kong on Heroku in one click. 164 | * Kong and Instaclustr: Let Instaclustr manage your Cassandra cluster. 165 | * Kubernetes Ingress Controller for Kong: Use Kong for Kubernetes Ingress. 166 | * Nightly Builds: Builds of the master branch available every morning at about 9AM PST. 167 | ### Kong Community Edition vs Entreprise Edition 168 | 169 | Kong Enterprise takes API management a step further and comes with all the tooling that we need to manage a full-blown 170 | infrastructure. 171 | 172 | ![alt test](screens/communityvsentreprise.png) 173 | 174 | 175 | ## Getting Started 176 | ### Pre-requise 177 | * Operating system (Linux, Windows, MacOS...); 178 | * Docker. 179 | ### Kong Setup 180 | #### 1.1 Create docker network 181 | First create docker network. 182 | ```bash 183 | docker network create neoxia-net 184 | ``` 185 | #### 1.2 Initialize database 186 | Kong can interface with either Cassandra or Postgres. I this example we will use Cassandra DB. 187 | ##### NB: 188 | The two main reasons why one would choose Cassandra as Kong's datastore are: 189 | - An ease to create a distributed setup (ideal for multi-region); 190 | - Ease to scale 191 | ```bash 192 | docker run -d --name neoxia-database \ 193 | --network=neoxia-net \ 194 | -p 9042:9042 \ 195 | cassandra:3 196 | ``` 197 | Then prepare the database for Kong. 198 | ```bash 199 | docker run --rm \ 200 | --network=neoxia-net \ 201 | -e "KONG_DATABASE=cassandra" \ 202 | -e "KONG_CASSANDRA_KEYSPACE=neoxia" \ 203 | -e "KONG_CASSANDRA_CONTACT_POINTS=neoxia-database" \ 204 | kong:latest kong migrations bootstrap 205 | ``` 206 | #### 1.3 Initialize kong 207 | ```bash 208 | docker run -d --name neoxia-container\ 209 | --network=neoxia-net \ 210 | -e "KONG_DATABASE=cassandra" \ 211 | -e "KONG_CASSANDRA_KEYSPACE=neoxia" \ 212 | -e "KONG_CASSANDRA_CONTACT_POINTS=neoxia-database" \ 213 | -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \ 214 | -p 8000:8000 \ 215 | -p 8443:8443 \ 216 | -p 8001:8001 \ 217 | -p 8444:8444 \ 218 | kong:latest 219 | ``` 220 | After that, we have two running docker containers, one for cassandra DB and another for kong instance. 221 | 222 | ![alt test](screens/docker-containers-1.png) 223 | 224 | Check Kong Instance. 225 | ```bash 226 | curl -i http://localhost:8001 227 | ``` 228 | ### Setup API server routing using Spring boot microservices 229 | Clone this repository to your local machine. 230 | #### 2.1 Create the Component 231 | change location to Spring-Boot-Micro-Forex-Service folder, build a new image and run a new container. 232 | ```bash 233 | cd pring-Boot-Micro-Forex-Service 234 | docker build -t forex-image . 235 | docker run --name forex-container --network=neoxia-net -p 8098:8098 forex-image 236 | ``` 237 | The server app is listned on port 8098 with endpoint /currency-exchange/from/EUR/to/INR: 238 | http://localhost:8098/currency-exchange/from/EUR/to/INR 239 | 240 | We can verify the connected containers to the neoxia-net docker network: 241 | ```bash 242 | docker network inspect neoxia-net 243 | ``` 244 | #### 2.2 Declare the Component with Kong 245 | ##### 2.2.1 Create the service 246 | Service refer to the upstream APIs and microservices that kong manages. 247 | ```bash 248 | curl -i -X POST \ 249 | --url http://localhost:8001/services/ \ 250 | --data 'name=forex-service-v1' \ 251 | --data 'url=http://172.18.0.5:8098/currency-exchange/from/EUR/to/INR' 252 | ``` 253 | ###### NB: 254 | 172.18.0.5 is the address of the component container. In this case forex-container. 255 | ##### 2.2.2 Create the route 256 | One route can be associated with one service, and this later can have one to many route to an upstream. 257 | ```bash 258 | curl -i -X POST \ 259 | --url http://localhost:8001/services/forex-service-v1/routes \ 260 | --data 'name=forex-route-v1' \ 261 | --data 'paths[]=/forex-v1' 262 | ``` 263 | Kong expose the created API at the port 8000. In this case we can visit the created route by: 264 | ```bash 265 | curl curl http://localhost:8000/forex-v1 266 | ``` 267 | ##### 2.2.3 Apply plugins to the service 268 | 269 | Before starting applying plugins to services or routes. We will use an open source UI that allow us to create services, routes, plugins ... This UI is named Konga! 270 | ###### 2.2.3.1 Setting up konga UI 271 | Let's create an docker container for konga. 272 | ```bash 273 | docker run -p 1337:1337 \ 274 | --network neoxia-net \ 275 | --name konga \ 276 | -e "NODE_ENV=development" \ 277 | pantsel/konga 278 | ``` 279 | Now Konga is exposed at 1337 port. 280 | First, we will connect konga with kong admin api. 281 | ###### NB: 282 | 172.18.0.3 is the kong container address 283 | 284 | ![alt test](screens/konga-connection.png) 285 | 286 | ###### 2.2.3.2 Add the Authentication plugin 287 | We can choose between a set of plugins to protect our services with an authentication layer. 288 | 289 | ![alt test](screens/authentication.png) 290 | 291 | For example to apply key auth plugin with CLI we can use the following command: 292 | ```bash 293 | curl -i -X POST \ 294 | --url http://localhost:8001/services/forex-service-v1/plugins/ \ 295 | --data 'name=key-auth' 296 | ``` 297 | This example create an key auth plugin applied to the forex-service-v1 service. 298 | 299 | To access the API we should create an consumer, and affect to it an api key. 300 | ```bash 301 | curl -i -X POST \ 302 | --url http://localhost:8001/consumers/ \ 303 | --data "username=forex-consumer" 304 | ``` 305 | ```bash 306 | curl -i -X POST \ 307 | --url http://localhost:8001/consumers/forex-consumer/key-auth/ \ 308 | --data 'key=123456' 309 | ``` 310 | ###### 2.2.3.3 Add the security plugin 311 | With security plugins, we can apply ACL(Access Control List), CORS, IP restriction or Bot detection. 312 | 313 | ![alt test](screens/securityPlugin.png) 314 | 315 | For example to apply ACL plugin with CLI we can use the following command: 316 | ```bash 317 | curl -X POST http://localhost:8001/services/forex-service-v1/plugins \ 318 | --data "name=acl" \ 319 | --data "config.whitelist=acl_group" \ 320 | --data "config.hide_groups_header=true" 321 | ``` 322 | Now we will associate a group to a consumer: 323 | ```bash 324 | curl -X POST http://localhost:8001/consumers/forex-consumer/acls \ 325 | --data "group=acl_group" 326 | ``` 327 | The api is protected with an api key and access control list. 328 | ###### 2.2.3.4 Add the Traffic Control plugin 329 | With the traffic control plugin we can Manage, throttle and restrict inbound and outbound API traffic. 330 | 331 | ![alt test](screens/traficControlPlugin.png) 332 | 333 | To apply Rate limiting plugin with CLI we can use the following command: 334 | ```bash 335 | curl -X POST http://localhost:8001/services/forex-service-v1/plugins \ 336 | --data "name=rate-limiting" \ 337 | --data "config.minute=2" \ 338 | --data "config.hour=100" 339 | ``` 340 | Now we can use the exposed api 2 times by minute and 100 times by hour. 341 | ###### 2.2.3.5 Add the serverless plugin 342 | Kong can invoke serverless functions in combination with other plugins: 343 | 344 | ![alt test](screens/serverlessPlugin.png) 345 | 346 | In this section we will call an AWS lambda function: 347 | ###### Step by step guide 348 | * First, let’s create an execution role called LambdaExecutor for our lambda function. In IAM Console create a new Role choosing the AWS Lambda service, there will be no policies as our function in this example will simply execute itself giving us back an hardcoded JSON as response without accessing other AWS resources. 349 | * Now let’s create a user named KongInvoker, used by our Kong API gateway to invoke the function. In IAM Console create a new user, must be provided to it programmatic access via Access and Secret keys; then will attach existing policies directly particularly the AWSLambdaRole predefined. Once the user creation is confirmed, store Access Key and Secret Key in a safe place. 350 | * Now we need to create the lambda function itself, will do so in N.Virginia Region (code us-east-1). In Lambda Management, create a new function Mylambda, there will be no blueprint as we are going to paste the code below; for the execution role let’s choose an existing role specifically LambdaExecutor created previously 351 | Use the inline code below to have a simple JSON response in return, note this is code for Python 3.6 interpreter. 352 | ```bash 353 | import json 354 | def lambda_handler(event, context): 355 | """ 356 | If is_proxy_integration is set to true : 357 | jsonbody='''{"statusCode": 200, "body": {"response": "yes"}}''' 358 | """ 359 | jsonbody='''{"response": "yes"}''' 360 | return json.loads(jsonbody) 361 | ``` 362 | * Finally we setup a Service & Route in Kong and link it to the function just created. 363 | ```bash 364 | curl -X POST http://kong:8001/services/forex-service-v1/plugins \ 365 | --data 'name=aws-lambda' \ 366 | --data-urlencode 'config.aws_key={KongInvoker user key}' \ 367 | --data-urlencode 'config.aws_secret={KongInvoker user secret}' \ 368 | --data 'config.aws_region=us-east-1' \ 369 | --data 'config.function_name=MyLambda' 370 | ``` 371 | ###### 2.2.3.6 Add the Analytics & Monitoring plugin 372 | This plugin is used to Visualize, inspect and monitor APIs and microservices traffic. 373 | 374 | ![alt test](screens/analyticsPlugin.png) 375 | 376 | We can apply promotheus plugin by using the following command: 377 | ```bash 378 | curl -X POST http://localhost:8001/services/forex-service-v1/plugins \ 379 | --data "name=prometheus" 380 | ``` 381 | Kong expose prometheus metrics in: 382 | ```bash 383 | http://localhost:8001/metrics 384 | ``` 385 | ###### 2.2.3.7 Add the Logging plugin 386 | We can log requests and response data using the logging plugin. 387 | 388 | ![alt test](screens/loggingPlugin.png) 389 | 390 | To apply file log plugin we will use the following command: 391 | ```bash 392 | curl -X POST http://localhost:8001/services/forex-service-v1/plugins \ 393 | --data "name=file-log" \ 394 | --data "config.path=/tmp/file.log" 395 | ``` 396 | This plugin will log HTTP request and response data in /tmp/file.log file. 397 | ## Conclusion 398 | Kong is a scalable, open source API Layer (also known as an API Gateway, or API Middleware). Kong runs in front of any RESTful API and is extended through Plugins, which provide extra functionality and services beyond the core platform. 399 | 400 | ![alt test](screens/kong-conclusion.png) 401 | 402 | Once Kong is running, every request being made to the API will hit Kong first, and then it will be proxied to the final API. In between requests and responses Kong will execute any plugin that we decided to install, empowering our APIs. Kong effectively becomes the entry point for every API request. 403 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/** 5 | !**/src/test/** 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | 30 | ### VS Code ### 31 | .vscode/ 32 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/.mvn/wrapper/MavenWrapperDownloader.java: -------------------------------------------------------------------------------- 1 | /* 2 | Licensed to the Apache Software Foundation (ASF) under one 3 | or more contributor license agreements. See the NOTICE file 4 | distributed with this work for additional information 5 | regarding copyright ownership. The ASF licenses this file 6 | to you under the Apache License, Version 2.0 (the 7 | "License"); you may not use this file except in compliance 8 | with the License. You may obtain a copy of the License at 9 | 10 | https://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, 13 | software distributed under the License is distributed on an 14 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | KIND, either express or implied. See the License for the 16 | specific language governing permissions and limitations 17 | under the License. 18 | */ 19 | 20 | import java.io.File; 21 | import java.io.FileInputStream; 22 | import java.io.FileOutputStream; 23 | import java.io.IOException; 24 | import java.net.URL; 25 | import java.nio.channels.Channels; 26 | import java.nio.channels.ReadableByteChannel; 27 | import java.util.Properties; 28 | 29 | public class MavenWrapperDownloader { 30 | 31 | /** 32 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. 33 | */ 34 | private static final String DEFAULT_DOWNLOAD_URL = 35 | "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; 36 | 37 | /** 38 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to 39 | * use instead of the default one. 40 | */ 41 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH = 42 | ".mvn/wrapper/maven-wrapper.properties"; 43 | 44 | /** 45 | * Path where the maven-wrapper.jar will be saved to. 46 | */ 47 | private static final String MAVEN_WRAPPER_JAR_PATH = 48 | ".mvn/wrapper/maven-wrapper.jar"; 49 | 50 | /** 51 | * Name of the property which should be used to override the default download url for the wrapper. 52 | */ 53 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; 54 | 55 | public static void main(String args[]) { 56 | System.out.println("- Downloader started"); 57 | File baseDirectory = new File(args[0]); 58 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); 59 | 60 | // If the maven-wrapper.properties exists, read it and check if it contains a custom 61 | // wrapperUrl parameter. 62 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); 63 | String url = DEFAULT_DOWNLOAD_URL; 64 | if(mavenWrapperPropertyFile.exists()) { 65 | FileInputStream mavenWrapperPropertyFileInputStream = null; 66 | try { 67 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); 68 | Properties mavenWrapperProperties = new Properties(); 69 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); 70 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); 71 | } catch (IOException e) { 72 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); 73 | } finally { 74 | try { 75 | if(mavenWrapperPropertyFileInputStream != null) { 76 | mavenWrapperPropertyFileInputStream.close(); 77 | } 78 | } catch (IOException e) { 79 | // Ignore ... 80 | } 81 | } 82 | } 83 | System.out.println("- Downloading from: : " + url); 84 | 85 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); 86 | if(!outputFile.getParentFile().exists()) { 87 | if(!outputFile.getParentFile().mkdirs()) { 88 | System.out.println( 89 | "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); 90 | } 91 | } 92 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); 93 | try { 94 | downloadFileFromURL(url, outputFile); 95 | System.out.println("Done"); 96 | System.exit(0); 97 | } catch (Throwable e) { 98 | System.out.println("- Error downloading"); 99 | e.printStackTrace(); 100 | System.exit(1); 101 | } 102 | } 103 | 104 | private static void downloadFileFromURL(String urlString, File destination) throws Exception { 105 | URL website = new URL(urlString); 106 | ReadableByteChannel rbc; 107 | rbc = Channels.newChannel(website.openStream()); 108 | FileOutputStream fos = new FileOutputStream(destination); 109 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 110 | fos.close(); 111 | rbc.close(); 112 | } 113 | 114 | } 115 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/Spring-Boot-Micro-Currency-Conversion-Service/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip 2 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/Dockerfile: -------------------------------------------------------------------------------- 1 | # Start with a base image containing Java runtime 2 | FROM openjdk:11.0.3-jdk-stretch 3 | 4 | # Add Maintainer Info 5 | LABEL maintainer="anas.tayaagi@gmail.com" 6 | 7 | # Add a volume pointing to /tmp 8 | VOLUME /tmp 9 | 10 | # Make port 8099 available to the world outside this container 11 | EXPOSE 8099 12 | 13 | # The application's jar file 14 | ARG JAR_FILE=target/Spring-Boot-Micro-Currency-Conversion-Service-0.0.1-SNAPSHOT.jar 15 | 16 | # Add the application's jar to the container 17 | ADD ${JAR_FILE} /opt/currency-conversion-image.jar 18 | 19 | # Run the jar file 20 | ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/opt/currency-conversion-image.jar"] 21 | 22 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/currency-conversion-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: currency-conversion-service 5 | labels: 6 | app: currency-conversion-service 7 | spec: 8 | ports: 9 | - port: 8099 10 | name: http 11 | selector: 12 | app: currency-conversion-service 13 | --- 14 | apiVersion: extensions/v1beta1 15 | kind: Deployment 16 | metadata: 17 | name: currency-conversion-service-v1 18 | labels: 19 | version: v1 20 | spec: 21 | replicas: 1 22 | template: 23 | metadata: 24 | labels: 25 | app: currency-conversion-service 26 | version: v1 27 | spec: 28 | containers: 29 | - name: currency-conversion-service 30 | image: anastayaa/currency-conversion-image 31 | resources: 32 | requests: 33 | cpu: "100m" 34 | imagePullPolicy: IfNotPresent #Always 35 | ports: 36 | - containerPort: 8099 37 | --- 38 | apiVersion: extensions/v1beta1 39 | kind: Deployment 40 | metadata: 41 | name: currency-conversion-service-v2 42 | labels: 43 | version: v2 44 | spec: 45 | replicas: 1 46 | template: 47 | metadata: 48 | labels: 49 | app: currency-conversion-service 50 | version: v2 51 | spec: 52 | containers: 53 | - name: currency-conversion-service 54 | image: anastayaa/currency-conversion-image 55 | resources: 56 | requests: 57 | cpu: "100m" 58 | imagePullPolicy: IfNotPresent #Always 59 | ports: 60 | - containerPort: 8099 -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven2 Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Mingw, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | # TODO classpath? 118 | fi 119 | 120 | if [ -z "$JAVA_HOME" ]; then 121 | javaExecutable="`which javac`" 122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 123 | # readlink(1) is not available as standard on Solaris 10. 124 | readLink=`which readlink` 125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 126 | if $darwin ; then 127 | javaHome="`dirname \"$javaExecutable\"`" 128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 129 | else 130 | javaExecutable="`readlink -f \"$javaExecutable\"`" 131 | fi 132 | javaHome="`dirname \"$javaExecutable\"`" 133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 134 | JAVA_HOME="$javaHome" 135 | export JAVA_HOME 136 | fi 137 | fi 138 | fi 139 | 140 | if [ -z "$JAVACMD" ] ; then 141 | if [ -n "$JAVA_HOME" ] ; then 142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 143 | # IBM's JDK on AIX uses strange locations for the executables 144 | JAVACMD="$JAVA_HOME/jre/sh/java" 145 | else 146 | JAVACMD="$JAVA_HOME/bin/java" 147 | fi 148 | else 149 | JAVACMD="`which java`" 150 | fi 151 | fi 152 | 153 | if [ ! -x "$JAVACMD" ] ; then 154 | echo "Error: JAVA_HOME is not defined correctly." >&2 155 | echo " We cannot execute $JAVACMD" >&2 156 | exit 1 157 | fi 158 | 159 | if [ -z "$JAVA_HOME" ] ; then 160 | echo "Warning: JAVA_HOME environment variable is not set." 161 | fi 162 | 163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 164 | 165 | # traverses directory structure from process work directory to filesystem root 166 | # first directory with .mvn subdirectory is considered project base directory 167 | find_maven_basedir() { 168 | 169 | if [ -z "$1" ] 170 | then 171 | echo "Path not specified to find_maven_basedir" 172 | return 1 173 | fi 174 | 175 | basedir="$1" 176 | wdir="$1" 177 | while [ "$wdir" != '/' ] ; do 178 | if [ -d "$wdir"/.mvn ] ; then 179 | basedir=$wdir 180 | break 181 | fi 182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 183 | if [ -d "${wdir}" ]; then 184 | wdir=`cd "$wdir/.."; pwd` 185 | fi 186 | # end of workaround 187 | done 188 | echo "${basedir}" 189 | } 190 | 191 | # concatenates all lines of a file 192 | concat_lines() { 193 | if [ -f "$1" ]; then 194 | echo "$(tr -s '\n' ' ' < "$1")" 195 | fi 196 | } 197 | 198 | BASE_DIR=`find_maven_basedir "$(pwd)"` 199 | if [ -z "$BASE_DIR" ]; then 200 | exit 1; 201 | fi 202 | 203 | ########################################################################################## 204 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 205 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 206 | ########################################################################################## 207 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then 208 | if [ "$MVNW_VERBOSE" = true ]; then 209 | echo "Found .mvn/wrapper/maven-wrapper.jar" 210 | fi 211 | else 212 | if [ "$MVNW_VERBOSE" = true ]; then 213 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." 214 | fi 215 | jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" 216 | while IFS="=" read key value; do 217 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;; 218 | esac 219 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" 220 | if [ "$MVNW_VERBOSE" = true ]; then 221 | echo "Downloading from: $jarUrl" 222 | fi 223 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" 224 | 225 | if command -v wget > /dev/null; then 226 | if [ "$MVNW_VERBOSE" = true ]; then 227 | echo "Found wget ... using wget" 228 | fi 229 | wget "$jarUrl" -O "$wrapperJarPath" 230 | elif command -v curl > /dev/null; then 231 | if [ "$MVNW_VERBOSE" = true ]; then 232 | echo "Found curl ... using curl" 233 | fi 234 | curl -o "$wrapperJarPath" "$jarUrl" 235 | else 236 | if [ "$MVNW_VERBOSE" = true ]; then 237 | echo "Falling back to using Java to download" 238 | fi 239 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" 240 | if [ -e "$javaClass" ]; then 241 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 242 | if [ "$MVNW_VERBOSE" = true ]; then 243 | echo " - Compiling MavenWrapperDownloader.java ..." 244 | fi 245 | # Compiling the Java class 246 | ("$JAVA_HOME/bin/javac" "$javaClass") 247 | fi 248 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 249 | # Running the downloader 250 | if [ "$MVNW_VERBOSE" = true ]; then 251 | echo " - Running MavenWrapperDownloader.java ..." 252 | fi 253 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") 254 | fi 255 | fi 256 | fi 257 | fi 258 | ########################################################################################## 259 | # End of extension 260 | ########################################################################################## 261 | 262 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 263 | if [ "$MVNW_VERBOSE" = true ]; then 264 | echo $MAVEN_PROJECTBASEDIR 265 | fi 266 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 267 | 268 | # For Cygwin, switch paths to Windows format before running java 269 | if $cygwin; then 270 | [ -n "$M2_HOME" ] && 271 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 272 | [ -n "$JAVA_HOME" ] && 273 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 274 | [ -n "$CLASSPATH" ] && 275 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 276 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 277 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 278 | fi 279 | 280 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 281 | 282 | exec "$JAVACMD" \ 283 | $MAVEN_OPTS \ 284 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 285 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 286 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 287 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM https://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" 124 | FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( 125 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 126 | ) 127 | 128 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 129 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 130 | if exist %WRAPPER_JAR% ( 131 | echo Found %WRAPPER_JAR% 132 | ) else ( 133 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 134 | echo Downloading from: %DOWNLOAD_URL% 135 | powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" 136 | echo Finished downloading %WRAPPER_JAR% 137 | ) 138 | @REM End of extension 139 | 140 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 141 | if ERRORLEVEL 1 goto error 142 | goto end 143 | 144 | :error 145 | set ERROR_CODE=1 146 | 147 | :end 148 | @endlocal & set ERROR_CODE=%ERROR_CODE% 149 | 150 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 151 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 152 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 153 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 154 | :skipRcPost 155 | 156 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 157 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 158 | 159 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 160 | 161 | exit /B %ERROR_CODE% 162 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.1.6.RELEASE 9 | 10 | 11 | com.example.currencyconversion 12 | Spring-Boot-Micro-Currency-Conversion-Service 13 | 0.0.1-SNAPSHOT 14 | Spring-Boot-Micro-Currency-Conversion-Service 15 | Demo project for Spring Boot 16 | 17 | 18 | 1.8 19 | Greenwich.SR2 20 | 21 | 22 | 23 | 24 | org.springframework.boot 25 | spring-boot-starter-web 26 | 27 | 28 | org.springframework.cloud 29 | spring-cloud-starter-openfeign 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-devtools 35 | runtime 36 | true 37 | 38 | 39 | org.springframework.boot 40 | spring-boot-starter-test 41 | test 42 | 43 | 44 | org.springframework.cloud 45 | spring-cloud-starter-netflix-ribbon 46 | 47 | 48 | 49 | 50 | 51 | 52 | org.springframework.cloud 53 | spring-cloud-dependencies 54 | ${spring-cloud.version} 55 | pom 56 | import 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | org.springframework.boot 65 | spring-boot-maven-plugin 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/src/main/java/com/example/currencyconversion/SpringBootMicroCurrencyConversionServiceApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.currencyconversion; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 6 | import org.springframework.cloud.openfeign.EnableFeignClients; 7 | 8 | @SpringBootApplication 9 | @EnableFeignClients("com.example.currencyconversion.proxy") 10 | @EnableDiscoveryClient 11 | public class SpringBootMicroCurrencyConversionServiceApplication { 12 | 13 | public static void main(String[] args) { 14 | SpringApplication.run(SpringBootMicroCurrencyConversionServiceApplication.class, args); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/src/main/java/com/example/currencyconversion/controller/CurrencyConversionController.java: -------------------------------------------------------------------------------- 1 | package com.example.currencyconversion.controller; 2 | 3 | import com.example.currencyconversion.model.CurrencyConversionBean; 4 | import com.example.currencyconversion.proxy.CurrencyExchangeServiceProxy; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.PathVariable; 8 | import org.springframework.web.bind.annotation.RestController; 9 | 10 | import java.math.BigDecimal; 11 | 12 | @RestController 13 | public class CurrencyConversionController { 14 | 15 | //private Logger logger = LoggerFactory.getLogger(this.getClass()); 16 | 17 | @Autowired 18 | private CurrencyExchangeServiceProxy proxy; 19 | 20 | @GetMapping("/currency-converter/from/{from}/to/{to}/quantity/{quantity}") 21 | public CurrencyConversionBean convertCurrency(@PathVariable String from, @PathVariable String to, 22 | @PathVariable BigDecimal quantity) { 23 | 24 | CurrencyConversionBean response = proxy.retrieveExchangeValue(from, to); 25 | return new CurrencyConversionBean(response.getId(), from, to, response.getConversionMultiple(), quantity, 26 | quantity.multiply(response.getConversionMultiple()), response.getPort()); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/src/main/java/com/example/currencyconversion/model/CurrencyConversionBean.java: -------------------------------------------------------------------------------- 1 | package com.example.currencyconversion.model; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class CurrencyConversionBean { 6 | private Long id; 7 | private String from; 8 | private String to; 9 | private BigDecimal conversionMultiple; 10 | private BigDecimal quantity; 11 | private BigDecimal totalCalculatedAmount; 12 | private int port; 13 | 14 | public CurrencyConversionBean() { 15 | 16 | } 17 | 18 | public CurrencyConversionBean(Long id, String from, String to, BigDecimal conversionMultiple, BigDecimal quantity, 19 | BigDecimal totalCalculatedAmount, int port) { 20 | super(); 21 | this.id = id; 22 | this.from = from; 23 | this.to = to; 24 | this.conversionMultiple = conversionMultiple; 25 | this.quantity = quantity; 26 | this.totalCalculatedAmount = totalCalculatedAmount; 27 | this.port = port; 28 | } 29 | 30 | public Long getId() { 31 | return id; 32 | } 33 | 34 | public void setId(Long id) { 35 | this.id = id; 36 | } 37 | 38 | public String getFrom() { 39 | return from; 40 | } 41 | 42 | public void setFrom(String from) { 43 | this.from = from; 44 | } 45 | 46 | public String getTo() { 47 | return to; 48 | } 49 | 50 | public void setTo(String to) { 51 | this.to = to; 52 | } 53 | 54 | public BigDecimal getConversionMultiple() { 55 | return conversionMultiple; 56 | } 57 | 58 | public void setConversionMultiple(BigDecimal conversionMultiple) { 59 | this.conversionMultiple = conversionMultiple; 60 | } 61 | 62 | public BigDecimal getQuantity() { 63 | return quantity; 64 | } 65 | 66 | public void setQuantity(BigDecimal quantity) { 67 | this.quantity = quantity; 68 | } 69 | 70 | public BigDecimal getTotalCalculatedAmount() { 71 | return totalCalculatedAmount; 72 | } 73 | 74 | public void setTotalCalculatedAmount(BigDecimal totalCalculatedAmount) { 75 | this.totalCalculatedAmount = totalCalculatedAmount; 76 | } 77 | 78 | public int getPort() { 79 | return port; 80 | } 81 | 82 | public void setPort(int port) { 83 | this.port = port; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/src/main/java/com/example/currencyconversion/proxy/CurrencyExchangeServiceProxy.java: -------------------------------------------------------------------------------- 1 | package com.example.currencyconversion.proxy; 2 | 3 | import com.example.currencyconversion.model.CurrencyConversionBean; 4 | import org.springframework.cloud.netflix.ribbon.RibbonClient; 5 | import org.springframework.cloud.openfeign.FeignClient; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.PathVariable; 8 | 9 | @FeignClient(name="forex-service") 10 | @RibbonClient(name="forex-service") 11 | public interface CurrencyExchangeServiceProxy { 12 | 13 | @GetMapping("/currency-exchange/from/{from}/to/{to}") 14 | CurrencyConversionBean retrieveExchangeValue 15 | (@PathVariable("from") String from, @PathVariable("to") String to); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=currency-conversion-service 2 | server.port=8099 3 | forex-service.ribbon.listOfServers=localhost:8000 4 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Currency-Conversion-Service/src/test/java/com/example/currencyconversion/SpringBootMicroCurrencyConversionService/SpringBootMicroCurrencyConversionServiceApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.currencyconversion.SpringBootMicroCurrencyConversionService; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class SpringBootMicroCurrencyConversionServiceApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/** 5 | !**/src/test/** 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | 30 | ### VS Code ### 31 | .vscode/ 32 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/.mvn/wrapper/MavenWrapperDownloader.java: -------------------------------------------------------------------------------- 1 | /* 2 | Licensed to the Apache Software Foundation (ASF) under one 3 | or more contributor license agreements. See the NOTICE file 4 | distributed with this work for additional information 5 | regarding copyright ownership. The ASF licenses this file 6 | to you under the Apache License, Version 2.0 (the 7 | "License"); you may not use this file except in compliance 8 | with the License. You may obtain a copy of the License at 9 | 10 | https://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, 13 | software distributed under the License is distributed on an 14 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | KIND, either express or implied. See the License for the 16 | specific language governing permissions and limitations 17 | under the License. 18 | */ 19 | 20 | import java.io.File; 21 | import java.io.FileInputStream; 22 | import java.io.FileOutputStream; 23 | import java.io.IOException; 24 | import java.net.URL; 25 | import java.nio.channels.Channels; 26 | import java.nio.channels.ReadableByteChannel; 27 | import java.util.Properties; 28 | 29 | public class MavenWrapperDownloader { 30 | 31 | /** 32 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. 33 | */ 34 | private static final String DEFAULT_DOWNLOAD_URL = 35 | "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; 36 | 37 | /** 38 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to 39 | * use instead of the default one. 40 | */ 41 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH = 42 | ".mvn/wrapper/maven-wrapper.properties"; 43 | 44 | /** 45 | * Path where the maven-wrapper.jar will be saved to. 46 | */ 47 | private static final String MAVEN_WRAPPER_JAR_PATH = 48 | ".mvn/wrapper/maven-wrapper.jar"; 49 | 50 | /** 51 | * Name of the property which should be used to override the default download url for the wrapper. 52 | */ 53 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; 54 | 55 | public static void main(String args[]) { 56 | System.out.println("- Downloader started"); 57 | File baseDirectory = new File(args[0]); 58 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); 59 | 60 | // If the maven-wrapper.properties exists, read it and check if it contains a custom 61 | // wrapperUrl parameter. 62 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); 63 | String url = DEFAULT_DOWNLOAD_URL; 64 | if(mavenWrapperPropertyFile.exists()) { 65 | FileInputStream mavenWrapperPropertyFileInputStream = null; 66 | try { 67 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); 68 | Properties mavenWrapperProperties = new Properties(); 69 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); 70 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); 71 | } catch (IOException e) { 72 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); 73 | } finally { 74 | try { 75 | if(mavenWrapperPropertyFileInputStream != null) { 76 | mavenWrapperPropertyFileInputStream.close(); 77 | } 78 | } catch (IOException e) { 79 | // Ignore ... 80 | } 81 | } 82 | } 83 | System.out.println("- Downloading from: : " + url); 84 | 85 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); 86 | if(!outputFile.getParentFile().exists()) { 87 | if(!outputFile.getParentFile().mkdirs()) { 88 | System.out.println( 89 | "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); 90 | } 91 | } 92 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); 93 | try { 94 | downloadFileFromURL(url, outputFile); 95 | System.out.println("Done"); 96 | System.exit(0); 97 | } catch (Throwable e) { 98 | System.out.println("- Error downloading"); 99 | e.printStackTrace(); 100 | System.exit(1); 101 | } 102 | } 103 | 104 | private static void downloadFileFromURL(String urlString, File destination) throws Exception { 105 | URL website = new URL(urlString); 106 | ReadableByteChannel rbc; 107 | rbc = Channels.newChannel(website.openStream()); 108 | FileOutputStream fos = new FileOutputStream(destination); 109 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 110 | fos.close(); 111 | rbc.close(); 112 | } 113 | 114 | } 115 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/Spring-Boot-Micro-Forex-Service/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip 2 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/Dockerfile: -------------------------------------------------------------------------------- 1 | # Start with a base image containing Java runtime 2 | FROM openjdk:11.0.3-jdk-stretch 3 | 4 | # Add Maintainer Info 5 | LABEL maintainer="anas.tayaagi@gmail.com" 6 | 7 | # Add a volume pointing to /tmp 8 | VOLUME /tmp 9 | 10 | # Make port 8080 available to the world outside this container 11 | EXPOSE 8098 12 | 13 | # The application's jar file 14 | ARG JAR_FILE=target/Spring-Boot-Micro-Forex-Service-0.0.1-SNAPSHOT.jar 15 | 16 | # Add the application's jar to the container 17 | ADD ${JAR_FILE} /opt/forex-image.jar 18 | 19 | # Run the jar file 20 | ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/opt/forex-image.jar"] 21 | 22 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/forex-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: forex-service 5 | labels: 6 | app: forex-service 7 | spec: 8 | ports: 9 | - port: 8098 10 | name: http 11 | selector: 12 | app: forex-service 13 | --- 14 | apiVersion: extensions/v1beta1 15 | kind: Deployment 16 | metadata: 17 | name: forex-service-v1 18 | labels: 19 | version: v1 20 | spec: 21 | replicas: 1 22 | template: 23 | metadata: 24 | labels: 25 | app: forex-service 26 | version: v1 27 | spec: 28 | containers: 29 | - name: forex-service 30 | image: anastayaa/forex-image 31 | resources: 32 | requests: 33 | cpu: "100m" 34 | imagePullPolicy: IfNotPresent #Always 35 | ports: 36 | - containerPort: 8098 -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven2 Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Mingw, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | # TODO classpath? 118 | fi 119 | 120 | if [ -z "$JAVA_HOME" ]; then 121 | javaExecutable="`which javac`" 122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 123 | # readlink(1) is not available as standard on Solaris 10. 124 | readLink=`which readlink` 125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 126 | if $darwin ; then 127 | javaHome="`dirname \"$javaExecutable\"`" 128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 129 | else 130 | javaExecutable="`readlink -f \"$javaExecutable\"`" 131 | fi 132 | javaHome="`dirname \"$javaExecutable\"`" 133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 134 | JAVA_HOME="$javaHome" 135 | export JAVA_HOME 136 | fi 137 | fi 138 | fi 139 | 140 | if [ -z "$JAVACMD" ] ; then 141 | if [ -n "$JAVA_HOME" ] ; then 142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 143 | # IBM's JDK on AIX uses strange locations for the executables 144 | JAVACMD="$JAVA_HOME/jre/sh/java" 145 | else 146 | JAVACMD="$JAVA_HOME/bin/java" 147 | fi 148 | else 149 | JAVACMD="`which java`" 150 | fi 151 | fi 152 | 153 | if [ ! -x "$JAVACMD" ] ; then 154 | echo "Error: JAVA_HOME is not defined correctly." >&2 155 | echo " We cannot execute $JAVACMD" >&2 156 | exit 1 157 | fi 158 | 159 | if [ -z "$JAVA_HOME" ] ; then 160 | echo "Warning: JAVA_HOME environment variable is not set." 161 | fi 162 | 163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 164 | 165 | # traverses directory structure from process work directory to filesystem root 166 | # first directory with .mvn subdirectory is considered project base directory 167 | find_maven_basedir() { 168 | 169 | if [ -z "$1" ] 170 | then 171 | echo "Path not specified to find_maven_basedir" 172 | return 1 173 | fi 174 | 175 | basedir="$1" 176 | wdir="$1" 177 | while [ "$wdir" != '/' ] ; do 178 | if [ -d "$wdir"/.mvn ] ; then 179 | basedir=$wdir 180 | break 181 | fi 182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 183 | if [ -d "${wdir}" ]; then 184 | wdir=`cd "$wdir/.."; pwd` 185 | fi 186 | # end of workaround 187 | done 188 | echo "${basedir}" 189 | } 190 | 191 | # concatenates all lines of a file 192 | concat_lines() { 193 | if [ -f "$1" ]; then 194 | echo "$(tr -s '\n' ' ' < "$1")" 195 | fi 196 | } 197 | 198 | BASE_DIR=`find_maven_basedir "$(pwd)"` 199 | if [ -z "$BASE_DIR" ]; then 200 | exit 1; 201 | fi 202 | 203 | ########################################################################################## 204 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 205 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 206 | ########################################################################################## 207 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then 208 | if [ "$MVNW_VERBOSE" = true ]; then 209 | echo "Found .mvn/wrapper/maven-wrapper.jar" 210 | fi 211 | else 212 | if [ "$MVNW_VERBOSE" = true ]; then 213 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." 214 | fi 215 | jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" 216 | while IFS="=" read key value; do 217 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;; 218 | esac 219 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" 220 | if [ "$MVNW_VERBOSE" = true ]; then 221 | echo "Downloading from: $jarUrl" 222 | fi 223 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" 224 | 225 | if command -v wget > /dev/null; then 226 | if [ "$MVNW_VERBOSE" = true ]; then 227 | echo "Found wget ... using wget" 228 | fi 229 | wget "$jarUrl" -O "$wrapperJarPath" 230 | elif command -v curl > /dev/null; then 231 | if [ "$MVNW_VERBOSE" = true ]; then 232 | echo "Found curl ... using curl" 233 | fi 234 | curl -o "$wrapperJarPath" "$jarUrl" 235 | else 236 | if [ "$MVNW_VERBOSE" = true ]; then 237 | echo "Falling back to using Java to download" 238 | fi 239 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" 240 | if [ -e "$javaClass" ]; then 241 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 242 | if [ "$MVNW_VERBOSE" = true ]; then 243 | echo " - Compiling MavenWrapperDownloader.java ..." 244 | fi 245 | # Compiling the Java class 246 | ("$JAVA_HOME/bin/javac" "$javaClass") 247 | fi 248 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 249 | # Running the downloader 250 | if [ "$MVNW_VERBOSE" = true ]; then 251 | echo " - Running MavenWrapperDownloader.java ..." 252 | fi 253 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") 254 | fi 255 | fi 256 | fi 257 | fi 258 | ########################################################################################## 259 | # End of extension 260 | ########################################################################################## 261 | 262 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 263 | if [ "$MVNW_VERBOSE" = true ]; then 264 | echo $MAVEN_PROJECTBASEDIR 265 | fi 266 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 267 | 268 | # For Cygwin, switch paths to Windows format before running java 269 | if $cygwin; then 270 | [ -n "$M2_HOME" ] && 271 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 272 | [ -n "$JAVA_HOME" ] && 273 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 274 | [ -n "$CLASSPATH" ] && 275 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 276 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 277 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 278 | fi 279 | 280 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 281 | 282 | exec "$JAVACMD" \ 283 | $MAVEN_OPTS \ 284 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 285 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 286 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 287 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM https://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 50 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" 124 | FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( 125 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 126 | ) 127 | 128 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 129 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 130 | if exist %WRAPPER_JAR% ( 131 | echo Found %WRAPPER_JAR% 132 | ) else ( 133 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 134 | echo Downloading from: %DOWNLOAD_URL% 135 | powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" 136 | echo Finished downloading %WRAPPER_JAR% 137 | ) 138 | @REM End of extension 139 | 140 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 141 | if ERRORLEVEL 1 goto error 142 | goto end 143 | 144 | :error 145 | set ERROR_CODE=1 146 | 147 | :end 148 | @endlocal & set ERROR_CODE=%ERROR_CODE% 149 | 150 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 151 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 152 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 153 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 154 | :skipRcPost 155 | 156 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 157 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 158 | 159 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 160 | 161 | exit /B %ERROR_CODE% 162 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.1.6.RELEASE 9 | 10 | 11 | com.example.forex 12 | Spring-Boot-Micro-Forex-Service 13 | 0.0.1-SNAPSHOT 14 | jar 15 | Spring-Boot-Micro-Forex-Service 16 | Demo project for Spring Boot 17 | 18 | 19 | 1.8 20 | 21 | 22 | 23 | 24 | org.springframework.boot 25 | spring-boot-starter-data-jpa 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-web 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-devtools 35 | runtime 36 | 37 | 38 | com.h2database 39 | h2 40 | runtime 41 | 42 | 43 | org.springframework.boot 44 | spring-boot-starter-test 45 | test 46 | 47 | 48 | org.springframework.cloud 49 | spring-cloud-starter-config 50 | 2.1.3.RELEASE 51 | 52 | 53 | 54 | 65 | 66 | 67 | 68 | 69 | org.springframework.boot 70 | spring-boot-maven-plugin 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/src/main/java/com/example/forex/SpringBootMicroForexServiceApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.forex; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cloud.client.discovery.EnableDiscoveryClient; 6 | 7 | @SpringBootApplication 8 | @EnableDiscoveryClient 9 | public class SpringBootMicroForexServiceApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(SpringBootMicroForexServiceApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/src/main/java/com/example/forex/controller/ForexController.java: -------------------------------------------------------------------------------- 1 | package com.example.forex.controller; 2 | 3 | import com.example.forex.dao.ExchangeValueRepository; 4 | import com.example.forex.model.ExchangeValue; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.core.env.Environment; 7 | import org.springframework.web.bind.annotation.GetMapping; 8 | import org.springframework.web.bind.annotation.PathVariable; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | @RestController 12 | public class ForexController { 13 | 14 | @Autowired 15 | private Environment environment; 16 | 17 | @Autowired 18 | private ExchangeValueRepository repository; 19 | 20 | @GetMapping("/currency-exchange/from/{from}/to/{to}") 21 | public ExchangeValue retrieveExchangeValue 22 | (@PathVariable String from, @PathVariable String to){ 23 | 24 | ExchangeValue exchangeValue = 25 | repository.findByFromAndTo(from, to); 26 | 27 | exchangeValue.setPort( 28 | Integer.parseInt(environment.getProperty("local.server.port"))); 29 | 30 | return exchangeValue; 31 | } 32 | 33 | } -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/src/main/java/com/example/forex/dao/ExchangeValueRepository.java: -------------------------------------------------------------------------------- 1 | package com.example.forex.dao; 2 | 3 | import com.example.forex.model.ExchangeValue; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | 6 | public interface ExchangeValueRepository extends 7 | JpaRepository { 8 | 9 | ExchangeValue findByFromAndTo(String from, String to); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/src/main/java/com/example/forex/model/ExchangeValue.java: -------------------------------------------------------------------------------- 1 | package com.example.forex.model; 2 | 3 | import javax.persistence.Column; 4 | import javax.persistence.Entity; 5 | import javax.persistence.Id; 6 | import java.math.BigDecimal; 7 | 8 | @Entity 9 | public class ExchangeValue { 10 | 11 | @Id 12 | private Long id; 13 | 14 | @Column(name="currency_from") 15 | private String from; 16 | 17 | @Column(name="currency_to") 18 | private String to; 19 | 20 | private BigDecimal conversionMultiple; 21 | private int port; 22 | 23 | public ExchangeValue() { 24 | 25 | } 26 | 27 | public ExchangeValue(Long id, String from, String to, BigDecimal conversionMultiple) { 28 | super(); 29 | this.id = id; 30 | this.from = from; 31 | this.to = to; 32 | this.conversionMultiple = conversionMultiple; 33 | } 34 | 35 | public Long getId() { 36 | return id; 37 | } 38 | 39 | public String getFrom() { 40 | return from; 41 | } 42 | 43 | public String getTo() { 44 | return to; 45 | } 46 | 47 | public BigDecimal getConversionMultiple() { 48 | return conversionMultiple; 49 | } 50 | 51 | public int getPort() { 52 | return port; 53 | } 54 | 55 | public void setPort(int port) { 56 | this.port = port; 57 | } 58 | 59 | } -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.application.name=forex-service 2 | server.port=8098 3 | spring.datasource.url=jdbc:h2:mem:testdb 4 | spring.datasource.driverClassName=org.h2.Driver 5 | spring.datasource.username=sa 6 | spring.datasource.password=password 7 | spring.jpa.database-platform=org.hibernate.dialect.H2Dialect 8 | spring.jpa.show-sql=true 9 | spring.h2.console.enabled=true -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/src/main/resources/data.sql: -------------------------------------------------------------------------------- 1 | drop table if exists exchange_value; 2 | create table exchange_value( 3 | id INT AUTO_INCREMENT PRIMARY KEY, 4 | currency_from VARCHAR(25), 5 | currency_to VARCHAR(25), 6 | conversion_multiple DECIMAL, 7 | port INT 8 | ); 9 | insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port) 10 | values(10001,'USD','INR',65,0); 11 | insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port) 12 | values(10002,'EUR','INR',75,0); 13 | insert into exchange_value(id,currency_from,currency_to,conversion_multiple,port) 14 | values(10003,'AUD','INR',25,0); -------------------------------------------------------------------------------- /Spring-Boot-Micro-Forex-Service/src/test/java/com/example/forex/SpringBootMicroForexService/SpringBootMicroForexServiceApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.forex.SpringBootMicroForexService; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class SpringBootMicroForexServiceApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /screens/analyticsPlugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/analyticsPlugin.png -------------------------------------------------------------------------------- /screens/apiGateway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/apiGateway.png -------------------------------------------------------------------------------- /screens/authentication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/authentication.png -------------------------------------------------------------------------------- /screens/clientToServiceCommunication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/clientToServiceCommunication.png -------------------------------------------------------------------------------- /screens/communityvsentreprise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/communityvsentreprise.png -------------------------------------------------------------------------------- /screens/docker-containers-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/docker-containers-1.png -------------------------------------------------------------------------------- /screens/gateway-stack-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/gateway-stack-2.png -------------------------------------------------------------------------------- /screens/kong-conclusion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/kong-conclusion.png -------------------------------------------------------------------------------- /screens/kong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/kong.png -------------------------------------------------------------------------------- /screens/konga-connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/konga-connection.png -------------------------------------------------------------------------------- /screens/securityPlugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/securityPlugin.png -------------------------------------------------------------------------------- /screens/serverlessPlugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/serverlessPlugin.png -------------------------------------------------------------------------------- /screens/test: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /screens/traficControlPlugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anastayaa/Kong-API-Gateway-and-Spring-Boot-Microservices/b4219a126673a028f2c63e01e0d91babfae195db/screens/traficControlPlugin.png --------------------------------------------------------------------------------