00:11
Theres no production no production no production。Getting your boot apps to Josh long favorite place on the Internet is made safer with certain techniques our next talk spring boot production boost we'teach you all about them please welcome Thomas fatalally。Hi everyone welcome I hope you're having a great day here at spring one I'm Thomas vial I work as a softwareer engineer in the systematic aish softwareer company。I'm really really passionate about spring boos in particular I really like working with cloud native technologies and even writing a book about it。It's called cloud native spring inaction where I talk about how To Build modern applications like micro services using spring BOO and deploying them in production with Co today I'd like To Go through five main areas in order To Boost your journey to production it's very important to。
01:17
Move fast and be in the market with the product that our users can really love and use I'm going To Go through five areas jbm and containers data integration configuration testing monitoring and management I will do that in a very practical way。We got To Build a small application that can be used by to manage books in a catalog it been its called book service it will expose a rest API to users and it will store data in a post rescue database so let's get started。Our first stop is at start dot spring do dio from the spring initializer application we can start a new project in particular I want to start a new gradl project using Java the latest spring wood version application will be called book service。
02:11
And I want to use Java sixteen now to expose a rest API I will use spring web I'm going To Build an imperative application and use to cut as the embedded server。Then I need the driver for post this is the database that I'm going to use。Next I have two options provided by spring data in order to implement the data layer of my application I can use spring data GPA which is a very popular choice based on the GP specification and hybernate and another option is spring data j d bc it's a newer option I really like it because it's based on the principles of domain driven design and I think it's an excellent choice for micro services so that's what I'm going to use today。Next since we want To Go in production we need to take good care of our data because our data are really important so what I want to use as well is flyway flyway will let us version control our database but we'LL see a minute its power。
03:19
Then we need to think about how we can test the application it's extremely important that we write auto test before going in production and we can leverage the test containerers library。Finally c native applications need To Be observable so we we need To Get visibility into its internal state when they run in production so for that goal I'm going to ADD spring boots actuator。That's it these are all the dependencs that we're going to use so I'LL move to the ID and we'LL start implementing the book service application。Here we have a standard spring with application and I want to start by implementing the domain model I can do that with records so I'LL DeFine a record for books with two fields and I field of typelong and the title field of type string。
04:16
The ID will also be the primary in the database so I'LL use the ID annotation to market。Next I'LL DeFine a book repository interface which extends the credit repository interface provided by spring data。It's a repository to fetch books which have a。Primaryly of type oflo and here I want to post a second because I'm really amazed by by this like we can implement the data layer of an application with just two lines comning the power of spring data which will automatically implement this interface for me providing all the meals to run crowd operation so to create read update and Li books and also can use records because spring data g d bc and encourage using imunable objects。
05:07
So with two lines we have our data implemented I really like that。Then we need to expose the rest API to manage books so I will create a rest controller this controller will handle request。To the slash books and points。Let's call it book controller。Like that。So first of all I need to inject book re fostering。That's how I access the database。And I'LL use constructor injection which is the recommended way of doing this then I'LL create a methodal to return all the books into in the catalog。So I'LL return an iable of book objects get of books。And islet return this dob repostery do find all this is one of the methods which are provided by spring data through the crowd repository interface。
06:08
Then I want a method to ADD new books to the catalog so I'LL use the post mapppping annotation。Returns a book so ADD new book。And the book is specified in the request body。Like that。And then I'LL use another method once again provided by the spring data fraud reposstery which ISA。And this is all I need to do to implement my logic we have the data layer with the domain model and the repository and we have a controller to expose a rest API the next step is making sure that when we start the application。In the database there's actually a table to store book data and for that we're going to use fly now if you think about your application source code。
07:01
It's now a given that we use version control so track all the changes in a GI repository where each change is represented by a commit now in a similar way we can use flyway and each change apply to the database is registered as a migration。That's how flyaway names it so in the resources folder I can create an SQL script。This will be the first change that I apply to the database so I'LL call it v one this is an enemy convention from fly。And we'LL use it to initialize the STEM。We can write migrations both in standard ES like I'm doing now or in Java。So create。Table book this new table will have To Columns and I column of Type Cereal。Which is also the primary keep。And then we have a column with the title of the book。These two types bacterial and virture will be mapped to long and stream in Java。
08:05
Just flyway is really convenient and I think it's important to use a tool like flyway for production because then we can really keep trackable the changes that we apply to a database and we can reproduce the state so this is the first version of our database but maybe in the next release of book service I want to ADD a new column to the book for example to store the author of the book and at that point I can create a new migration script it will be version to in order to create this new column so when the application starts up flyway well check。All the migration scripts and if any of them has not be run yet he will run it so it will ensure that the state of the database is always consistent and it's always healthy。The final thing we need to do is conffiguring springri to interact with a specific postqueual instance that in this case I have running on my computer so I'LL open the property file。
09:09
And I conffigure the URL I'm using JD bc it's post rescue database the instance is running on my local host on board five four three two and the database is called book catalog。Then I also need to DeFine user name and faster very secure。Like that and that's it this complete the implementation of our application most of the work has been done through the spring with of other configuration and through the power of spring data this is really important because time the time to market is a strategic advantage for organization so we really want To Go to production fast that's where our application brings value to customers users and to the business。We don't know if the application works so we need to write some auto test because we want to have high quality code and we have a few different choices of course we could run we could write some unit test they wouldn't be different than with any other job application using gen unit and moquito in that case there's no spring involved。
10:20
And we could also write integration test integration test and youll get an example when you initialize a project from start the spring the dio it can be conffigure through the spring BOO test annotation by using this annotation I can set up a full spring context including a web environment exposing its services to a random port random because I don't care where it's running because my focus will be on testing the application。And I can do that。In different ways one of the options is using the web test client utility which is a kind that I can use to call the book service application and test for example that I can ADD a book to the catalog correctly。
11:04
So what I do here is first of all creating a book。The ID will be handled by the framework and database just possible now and then the title for example the hobby。Then I can use web client and send a post request。To。The you were right。Slash books this is what we DeFined in the rest controller。Then I want to pass the book to create in the request body。And then I'LL send the request at this point I expect To Get back a successful response so I can use expect status is two hundred successful and also I expect To Get back the book that has just been created so it should be of type book class。And I also want to check what is inside so I love。
12:02
I'LL DeFine the actual book here。And first of all I want to assert。That now the book created in the database has an ID。So the idea should not be known。And then I want to assert that the book。Title is the same as the one that I previously specified so it should be equal To Book to create。TT。Like that。So now I could run this test but it wouldn't work and the reason why is that this the application running in the test context would try to call the post rescues database through this URL。But we need to do something because this postal database is running on my computer so how can I make sure that the test self contained I can use test containers which is a great tool built on top of gen unit that provides。
13:03
Contains for all your all your external dependency so you can write integration test you see the actual external dependency and that guarantees the environment parity because then if production we use post it's important that we use posts also for our auto test because we make them reliable if we used something else like the h to embedded database。It would still work but it wouldn't be a hundred percent reliable because it's a different database compared to what we use in production。So what we need to do is overriding this value and pointing to an instance of post rescue provided by test containers。So I can do that in a few different ways a very convenient one is using the test property source onno and from here I will override the property。Spring data source URL。And the new bell will be jybishp。
14:02
Then TC which stands for test containers this is a content with by test containers the database should be post rescue。Version thirteen。And I missing the call yes。Then under the hood when I run the test now test containers will initialize a new post rescues container。Specifically for the test and springbo will run the test against that instance when the test is over then the container will be will be shut down so let's see now the result of the test。And is great this is great we can run this test now everywhere as long as we have a container runtime and we can be sure that it's reliable because it's using the same。Database that we're using in production。Now I I'd like to point out something this application is an imperative application if you'are working with reactive spring you need To Be aware that flyway which is also run as part of the test doesn't support the r two d bc driver for a reactive applications so what you have to do in that case besides DeFining the data source for。
15:22
嗯。Yeah for your postres you also need to configure flyaway explicitly because you will use a different driver。But everything else will work the same both for imperative and reactive applications。Perfect so we are almost close To Be ready to deploy the application in production we need to think about what will happen once it's up and running there we need to have a way To Get disability into how the application is doing how it's beha。And that's why we added the springbu actctuator to the dependences list of the project springbu actctuator exposes different end points with different information now for this presentation I will expose them all。
16:10
But I recommend you only expose the ones that you actually need there are different end points a very useful one is the health endpoint which provides information about the health of the application。By default it just returns and up or down status but you can configurate and show more details。So we can ADD information about the components used by the application。More details and if you're running on couber notice you can also enable the pros now they are actually enable by defauld if the application is running in couber notice since I'm running it on my local computer I need to enable them explicitly。Having said that let's grant the application。We can first ensure that it works fine of course the the business logic that we implemented for the book catalog and then we check the spring good actuer ends。
17:09
Application is running perfect so what I do now first I want to create a new book。The party is eighty eighty was slash h。And the book will be the lord of the race。And is created correctly just to double check we can also send a get request to the same endpoint。And this endpoint returns the full catalog books of course we have only one so that's the one that we are kidding。Then all the springbo taxctuator and points are pres with slash actctuator so for example I can get information about the health with slash actuator slash health。For example you can see that the database is up so the integration of spring BOO with post is okay and you have also information about the livess and readiness states this two states are really important for cooper medicineism and you can get them through specific endpoints so the livener state if it returns a down status that cois will restart the container because it means that entered a fault state。
18:23
Instead if the application is not ready。It means that he cannot handle more request so con will stop sending traffic to that specific instance。Other useful endpoints for our case the book service application are flywaysh activators lesssh flyway from here we can see all the information regarding immigrations that we read。This information is stored in the database I can show you I Switch to the database view you can see that。Flyway will create automatically a flyway stemmer history table。
19:02
And in here it will store the status of all immigrations that have been run。There's also a few more ends that I'd like to show you one is the premitive endpoints which returns useful metrics about the application so you can scrape them from a perted server and show them in dash for example using ranna。And if you are dealing with memory LIS which are really。Yeah I'm knowing box that we might have in our code it might be useful getting a hipto so a snapshot of the hip memory from your application so that you can investigate further where is the memory league and fix performance issues。At this point we really have everything we need To Go to production so we need to prepare the application To Be deployable we have to main option one is packaging the application as a jar and this jar is a fat jar is stand alone so it includes all the dependencec is needed by the to run correctly there's no external dependency except for the jamyal machine。
20:13
So I can run it with javadash jark。And I can take it and deploy to platforms like called foundry like heroical or to make the application even more portable and deployable on platform like cooper notice。As easily I can package the application as a container image。And there's a dub for gravel and for maiden the spring would plug in。Under the hood uses cloud billbux which is a specification to convert application source code into coner images without the need to provide the do file it's really great in particular springwoods is using the packet of billpa implementation which produce production RA images which follow all the best practices in terms of security and are optimize both for building and running。
21:04
And my favorite feature is a component called Java memory calculator which is included in the final image and that in will configur the JA vial machine running in your container at startup time so you don't have to do that explicitly conffiguring the heap and all the known heap memory areas at that's great and it helps us in our journey To Go to production fast。And here it is we got a container image back。This is ready To Go in production inan platform。I'd like to point out a few things that are useful when you do that so I'LL go back to my slides now。First of all it's about how to configure the application because we used。Property files for our local development environment but there are different strategies you can adopt in the springercosystem you really have many different options that fit any data you might have。
22:09
A strategy that I'd like to share with you today is the following。I would use property files to DeFine default values and value that in general you would use in your development environment like we did earlier with the URL for the local post。Then for all configuration data which are not related to the infrastructure you might use a configuration service like spnklo comfy。So things like connection polls time out feature flags。And it can be any configuration service either run by you or managed by a platform or even provided by the platform as a service for example if you're running applications on azure you could use azure keyboard。And integrated with spring BOO through the spring cloud aer project。Finally if you're running on cooper notice I would use conig NUS and cigarettes which by the way are supported naly by spring BOO you don't need anything else to make that work I would use them for cober specific properties so for example service names of other services running in cober or which profiles to activate in a springbu application。
23:21
Talking instead about conffiguring the container itself so not the application it's important to take care of how we assign CPU memory to each container。No notice that the CPU is a compressible resource so when the limit is it the process isro the application would still run but maybe with lower performance instead memory is a non compress resource if we hit the limit then the application dies with a dreadful out of memory killed error we don't want to do that。So pay attention to how you configure both request and limits for both memory and CPU in particular memory。
24:03
It's important to set both the request which are the minimum value assigned to the container and the limits and for j vm containers。We usually assigned them equal because that guarantees the best performance with the j DM and the CPU if you want To Get some performance boost especially startup you could omit the limit since we know that it's a comible resource so the application will still run it would just beroled。The final thing remember to use the livess and readines probes that we had just configured in the springwood actctuator so you can use them and Co ne will manage the container in a nice way。This was our little journey to production we went through these five different areas。I really thank you for joining this presentation I hope you like it and I wish you a great rest of the conference。
25:08
I also want to thank the organizers that make this possible thank you very much。Thomas that was great really appreciate it Josh you made Josh long crowd in helping many many people get applications more secure into production so really appreciate it。I'm glad to hear that thank you。After this be sure to click on the join the conversation link to join slack where you can find the q a link。When you do go to slack make sure you also check out our sponsored channels and show them some love they help keep the videos coming and make all this possible。Our next talk will be at how to improve stability and your integration test capabilities so you can stop ignoring those broken builds we'LL start the next talk at one o five eastern。
我来说两句